文本左右对齐
给定一个单词数组和一个长度 maxWidth,重新排版单词,使其成为每行恰好有 maxWidth 个字符,且左右两端对齐的文本。
你应该使用"贪心算法"来放置给定的单词;也就是说,尽可能多地往每行中放置单词。必要时可用空格 ' ' 填充,使得每行恰好有 maxWidth 个字符。
要求尽可能均匀分配单词间的空格数量。如果某一行单词间的空格不能均匀分配,则左侧放置的空格数要多于右侧的空格数。
文本的最后一行应为左对齐,且单词之间不插入额外的空格。
说明:
- 单词是指由非空格字符组成的字符序列。
- 每个单词的长度大于 0,小于等于 maxWidth。
- 输入单词数组 words 至少包含一个单词。
示例:
输入:
words = ["This", "is", "an", "example", "of", "text", "justification."]
maxWidth = 16
输出:
[
"This is an",
"example of text",
"justification. "
]
1 import java.util.*;
2
3 public class Solution {
4 public ArrayList<String> fullJustify(String[] words, int maxWidth) {
5 ArrayList<String> res = new ArrayList<String>();
6 int n = words.length;
7 int i = 0;
8 while (i < n) {
9 StringBuilder sb = new StringBuilder();
10 int last = i + 1;
11 int len = words[i].length();
12 while (last < n && len + 1 + words[last].length() <= maxWidth) {
13 len += 1 + words[last].length();
14 last++;
15 }
16 // 最后一行
17 if (last == n) {
18 for (int j = i; j < n; j++) {
19 sb.append(words[j] + " ");
20 }
21 sb.deleteCharAt(sb.length() - 1);
22 for (int j = sb.length(); j < maxWidth; j++) {
23 sb.append(" ");
24 }
25 } else {
26 // 只有一个word
27 if (last - i == 1) {
28 sb.append(words[i]);
29 for (int j = words[i].length(); j < maxWidth; j++)
30 sb.append(" ");
31 } else {// 有多个单词
32 int wordNum = last - i;
33 int wordTotal = 0;
34 for (int j = i; j < last; j++) {
35 wordTotal += words[j].length();
36 }
37 // eachSpace为每个单词间的空格数;r是余数,表示前r个空格数为eachSpace+1
38 int eachSpace = (maxWidth - wordTotal) / (wordNum - 1);
39 int r = (maxWidth - wordTotal) % (wordNum - 1);
40
41 for (int j = i; j < last; j++) {
42 sb.append(words[j]);
43 if (j < last - 1) {
44 for (int k = 0; k < eachSpace + ((j - i) < r ? 1 : 0); k++) {
45 sb.append(" ");
46 }
47 }
48 }
49 }
50 }
51 res.add(sb.toString());
52 i = last;
53 }
54 return res;
55 }
56 }
来源:https://www.cnblogs.com/kexinxin/p/10163044.html