题目分析:输入一个字符串数组和一个规定长度L。将这个字符串数组的元素尽可能放到长度为L的字符串中,数组中的字符串不能拆开,一个长度L的字符串包括的若干个字符串之间用空格间隔开。放置空格的原则为:左边的空格要多于右边的空格,最后一行靠左对齐。
解题思路:
1)非最后一行,如果只有一个单词,单词靠左放置,右边放空格;
2)非最后一行,如果有多个单词,计算间隔n、多于空格s(每个单词间放一个空格多出的空格数),
每个间隔在多方s/n个,前s%n个间 隔在多方个空格;
3)最后一行中,单词之间只有一个空格,其余空格全部在最右边。
举例如下:
“This”, “is”, “an”, “example”,“of”,“text”,“justification.”,长度为16。执行结果如下:
“This is an”
“example of text”
“justification. "
实现程序:
class Solution
{
public:
// 添加空格函数
void addSpace(string &s, int count)
{
for (int i = 0; i < count; i++)
{
s.push_back(' ');
}
}
vector<string> fullJustify(vector<string> &words, int maxWidth)
{
vector<string> result;
// 统计字符串中单词数目
int len = words.size();
int i = 0;
while (i < len)
{
// 记录每行单词数目
int rowlen = 0;
int j = i;
// 用于统计一行中最多能够放置单词数目n
while (j < len && rowlen + words[j].size() <= maxWidth)
{
rowlen += (words[j++].size() + 1);
}
// 处理一行中只能放入一个单词的特殊情况
if (j - i == 1)
{
result.push_back(words[i]);
addSpace(result.back(), maxWidth - words[i].size());
i = j;
continue;
}
// 计算当前行字符的总长度
int charLen = rowlen - (j - i);
// 计算平均每个单词后的空格,其中j < len表示不是最后一行,当为最后一行,则单词间直接放置一个空格
int meanSpace = j < len ? (maxWidth - charLen) / (j - i - 1) : 1;
// 计算每行应该多放置的多于空格,其中j < len表示不是最后一行,但为最后一行,则多于放在一起
int leftSpace = j < len ? (maxWidth - charLen) % (j - i - 1) : maxWidth - charLen - (j - i - 1);
string temp;
// 放置一行单词,不包括放置最后一个单词
for (int k = i; k < j - 1; k++)
{
temp += words[k];
addSpace(temp, meanSpace);
// 非最后一行放置多于空格
if (j < len && leftSpace > 0)
{
temp.push_back(' ');
leftSpace--;
}
}
// 放置一行中的最后一个单词
temp += words[j - 1];
// 最后一行放置最后一个单词
if (leftSpace > 0)
addSpace(temp, leftSpace);
result.push_back(temp);
i = j;
}
return result;
}
};