标签:
原题链接在这里:https://leetcode.com/problems/text-justification/
用count + (i-last) + words[i].length() 来表示当前行的总长度,若是比maxWidth大了,就要减去最后一个词。这里面i-last表示空格的数量。
减去一个词后要对其,所以要算每两个次之间最少有 sapceNum个空格,若是还有剩余就是extraSpace. 但注意若是 i-last-1 == 0表示本行只有一个词,需要靠左。
简历StringBuilder sbPerLine, 开始从last 到i加词,加空格。但注意一行最后一个词后面不需要加空格,所以j<i-1时才加空格。
若本行只有一个词,需要在后面补全空格。res加上这一行后更新count 为0, last为i.
最后处理最后一行,若是count + (i-last) + words[i].length()恰好等于maxWidth也是在这里处理。
Time Complexity O(n), n是words数组的大小,每个词不会被扫两遍。Space O(lineNum*maxWidth). lineNum是最后的结果行数。
AC Java:
public class Solution { public List<String> fullJustify(String[] words, int maxWidth) { List<String> res = new ArrayList<String>(); if(words == null || words.length == 0){ return res; } int len = words.length; int count = 0; int last = 0; for(int i = 0; i<len; i++){ if(count + (i-last) + words[i].length() > maxWidth){ int spaceNum = 0; int extraSpace = 0; if(i-last-1>0){ //如果本行不止一个词,spaceNum和extraSpace才会update spaceNum = (maxWidth-count)/(i-last-1); extraSpace = (maxWidth-count)%(i-last-1); } StringBuilder sbPerLine = new StringBuilder(); for(int j = last; j<i; j++){ sbPerLine.append(words[j]); if(j<i-1){ //每一行最后一个词后面不用加空格,若是本行只有一个词,下面处理 for(int k = 0; k<spaceNum; k++){ sbPerLine.append(" "); } if(extraSpace > 0){ sbPerLine.append(" "); extraSpace--; } } } //如果本行只有一个词 for(int j = sbPerLine.length(); j<maxWidth; j++){ sbPerLine.append(" "); } res.add(sbPerLine.toString()); count = 0; last = i; } count += words[i].length(); } //处理最后一行,若是只有一行且长度正好等于maxWidth也在下面处理 StringBuilder lastLine = new StringBuilder(); for(int i = last; i<len; i++){ lastLine.append(words[i]); if(lastLine.length()<maxWidth){ lastLine.append(" "); } } for(int i = lastLine.length(); i<maxWidth; i++){ lastLine.append(" "); } res.add(lastLine.toString()); return res; } }
参考了这篇帖子:http://www.cnblogs.com/springfor/p/3896168.html
标签:
原文地址:http://www.cnblogs.com/Dylan-Java-NYC/p/4944712.html