class Solution {
//simplify the problem
public:
vector<string> fullJustify(vector<string> &words, int L) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
vector<string> ret;
int begin = 0, len = 0, n = words.size();
for (int i = 0; i < n; ++i) {
if (len + words[i].size() + (i - begin) > L) {
ret.push_back(connect(words, begin, i - 1, len, L, false));//push back one line
begin = i;
len = 0;
}
len += words[i].size();
}
ret.push_back(connect(words, begin, n - 1, len, L, true));
return ret;
}
string connect(vector<string> &words, int begin, int end, int len, int L, bool leftJustify) {
string s;
int n = end - begin + 1;
for (int i = 0; i < n; ++i) {
s += words[begin + i];
addSpaces(s, i, n - 1, L - len, leftJustify);
}
if (s.size() < L) s.append(L - s.size(), ' ');
return s;
}
void addSpaces(string &s, int i, int n, int L, bool leftJustify) {
if (n < 1 || i > n - 1) return;
int spaces = leftJustify ? 1 : (L / n + (i < (L % n) ? 1 : 0));
s.append(spaces, ' ');
}
};
second time
class Solution {
public:
string leftJustified(int L, vector<string>& words, int start, int end)
{
string ans;
for(int i = start; i < end; ++i)
{
ans = ans+words[i];
ans.push_back(' ');
}
ans = ans+words[end];
int curCnt = 0;
for(int i = start; i <= end; ++i) curCnt += words[i].size();
curCnt += (end-start);
int lastCnt = L-curCnt;
ans.append(lastCnt, ' ');
return ans;
}
string evenJustified(int L, vector<string>& words, int start, int end)
{
int curCnt = 0;
for(int i = start; i <= end; ++i) curCnt += words[i].size();
curCnt += (end-start);
int leftCnt = L-curCnt;
string ans;
if(end-start >= 1)
{
int addCnt = leftCnt/(end-start);
int extraCnt = leftCnt%(end-start);
for(int i = start, j = 1; i < end; ++i, ++j)
{
int spaceCnt = 1+addCnt;
if(j <= extraCnt) spaceCnt++;
ans = ans+words[i];
ans.append(spaceCnt, ' ');
}
ans = ans+words[end];
}
else
{
ans = ans+words[end];
ans.append(L-words[end].size(), ' ');
}
return ans;
}
vector<string> fullJustify(vector<string> &words, int L) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
if(words.size() == 0 || L == 0) return words;
int start = 0;
vector<string> ans;
while(start < words.size())
{
int curWordLen = 0;
int curWordCnt = 0;
int i;
for(i = start; i < words.size(); ++i)
{
curWordLen += words[i].size();
curWordCnt++;
if(curWordLen+curWordCnt-1 > L)
{
i--;
break;
}
}
if(i == words.size())
{
i--;
string tmp = leftJustified(L, words, start, i);
ans.push_back(tmp);
}
else
{
string tmp = evenJustified(L, words, start, i);
ans.push_back(tmp);
}
start = i+1;
}
return ans;
}
};
本文介绍了一种使用C++解决单词间距问题的方法,包括如何简化问题、处理字符串连接和添加空格,最终实现全行对齐和左对齐的文本格式化。
344

被折叠的 条评论
为什么被折叠?



