68. Text Justification
程序员文章站
2024-03-24 14:34:58
...
字符串对齐。
别人的分析:
一行一行的来处理,首先要做的就是确定每一行能放下的单词数,这个不难,就是比较n个单词的长度和加上n - 1个空格的长度跟给定的长度L来比较即可,找到了一行能放下的单词个数,然后计算出这一行存在的空格的个数,是用给定的长度L减去这一行所有单词的长度和。得到了空格的个数之后,就要在每个单词后面插入这些空格,这里有两种情况,比如某一行有两个单词"to" 和 "a",给定长度L为6,如果这行不是最后一行,那么应该输出"to a",如果是最后一行,则应该输出 "to a ",所以这里需要分情况讨论,最后一行的处理方法和其他行之间略有不同。最后一个难点就是,如果一行有三个单词,这时候中间有两个空,如果空格数不是2的倍数,那么左边的空间里要比右边的空间里多加入一个空格,那么我们只需要用总的空格数除以空间个数,能除尽最好,说明能平均分配,除不尽的话就多加个空格放在左边的空间里。
这道题在写每一行的时候,采用的方法是,把总的spaces个数记录下来,每写一个,就在spaces里减掉相应的spaces,这样不会写乱。
class Solution {
public:
vector<string> fullJustify(vector<string>& words, int maxWidth) {
vector<string> res;
int i = 0;
while (i < words.size()) {
int j = i, len = 0;
while (j < words.size() && len + words[j].size() + j - i <= maxWidth) {
len += words[j++].size();
}
string out;
int space = maxWidth - len;
for (int k = i; k < j; ++k) {
out += words[k];
if (space > 0) {
int tmp;
if (j == words.size()) {
if (j - k == 1) tmp = space;
else tmp = 1;
}
else {
if (j - k - 1 > 0) {
if (space % (j - k - 1) == 0) //j-k+1是空格的个数
tmp = space / (j - k - 1);
else
tmp = space / (j - k - 1) + 1;
}
else tmp = space;
}
out.append(tmp, ' ');
space -= tmp;
}
}
res.push_back(out);
i = j;
}
return res;
}
};
推荐阅读
-
68. Text Justification
-
Windows下Sublime Text编译运行Object C
-
LintCode 68. Binary Tree Postorder Traversal
-
在现有的元素内添加新元素而不影响现有内容insertAdjacentElement/HTM/Text
-
sublime text3 中使用snippet自定义快捷代码段
-
Sublime Text自定义snippet
-
OSX shell 添加sublime text 启动命令
-
sublime text3 解决中文乱UTF -8
-
SQL Server数据库如何获取TEXT字段的内容长度 博客分类: 数据库
-
text_area限定字数 博客分类: js