68. 文本左右对齐
题目:
思路:
【1】首先是要先看懂题目,题目要求的是限制每一行的字符个数,然后在有限的空间内往里面塞集合里面的字符串。而且隐性条件就是两个字符串之间必须要有空格作为间隔,所以就会有 s1.len+1空格+s2.len+1空格+....+sn.len <= maxWidth,如 maxWidth = 20 ,s1.len = 4 ,s2.len = 5 ,s3.len = 2 ,s4.len = 4,s5.len = 6 , 故存在 s1.len+ 1空格 + s2.len+1空格 +s3.len+1空格+s4.len+1空格+s5.len = 4+1+5+1+2+1+4+1+6 = 24 > 20 所以s5要放置于下一行,那么就会变成 s1.len+ 1空格 + s2.len+1空格 +s3.len+1空格+s4.len = 4+1+5+1+2+1+4 = 18 < 20 ,所以不足的部分需要用空格补充(而且在不是最后一行的情况,就是需要从左往右向每个空格的位置不断填入【要求平均】)
代码展示:
//时间1 ms 击败 54.55% //内存39.9 MB 击败 51.76% //时间复杂度:O(m),其中 m 是数组 words中所有字符串的长度之和。 //空间复杂度:O(m)。 class Solution { public List<String> fullJustify(String[] words, int maxWidth) { ArrayList<String> res = new ArrayList<String>(); ArrayList<String> temArr = new ArrayList<String>(); int temLen = 0; for (int i = 0; i < words.length; i++){ String w = words[i]; // 这里为什么空格位置数会是数组当前的大小 // 因为我们是需要多加一个字符所以对应的每个元素后面其实都会需要一个空格 // 如a+" "+b+" ",那么将当前字符x纳入的时候就会变成a+" "+b+" "+x,刚好满足隐性条件 int spaceNum = temArr.size(); if ((temLen + w.length()+ spaceNum) > maxWidth){ res.add(combineString(temArr,temLen,maxWidth,true)); temArr = new ArrayList<String>(); temLen = 0; } temArr.add(w); temLen += w.length(); // 表示已经达到最后一行了 if (i == words.length - 1){ res.add(combineString(temArr,temLen,maxWidth,false)); } } return res; } public String combineString(List<String> words, int wlen ,int maxWidth , boolean align) { StringBuffer buf = new StringBuffer(); // align 表示是否需要左右对齐 if (align){ // 空格位置数 int space = words.size() > 1 ? words.size() - 1 : 1; // 空格数 int spaceNum = maxWidth - wlen; // 每个位置的空格数 int num = space > 1 ? spaceNum / space : spaceNum; // 应向左边多放置的空格数 int leftNum = spaceNum % space; for (int i = 0; i < words.size(); i++){ String w = words.get(i); buf.append(w); if (i < words.size()-1){ int index = 0; while (index++ < num){ buf.append(" "); } if (leftNum-- > 0){ buf.append(" "); } } } }else { //否则是最后一行,需要左对齐,在行末填充空格 // 遍历数组,进行组合成字符串 // (因为存在隐形规定,字符串之间需要存在空格间隔开) for (String w : words){ buf.append(w).append(" "); } // 如果存在超出则删除 while (buf.length() > maxWidth){ buf.deleteCharAt(buf.length() - 1); } } // 不足部分则补充 while (buf.length() < maxWidth){ buf.append(" "); } return buf.toString(); } }