给定一个单词数组和一个长度 maxWidth,重新排版单词,使其成为每行恰好有 maxWidth 个字符,且左右两端对齐的文本。
你应该使用“贪心算法”来放置给定的单词;也就是说,尽可能多地往每行中放置单词。必要时可用空格 ' '
填充,使得每行恰好有 maxWidth 个字符。
要求尽可能均匀分配单词间的空格数量。如果某一行单词间的空格不能均匀分配,则左侧放置的空格数要多于右侧的空格数。
文本的最后一行应为左对齐,且单词之间不插入额外的空格。
示例:
输入: words = ["This", "is", "an", "example", "of", "text", "justification."] maxWidth = 16 输出: [ "This is an", "example of text", "justification. " ]
示例 2:
输入: words = ["What","must","be","acknowledgment","shall","be"] maxWidth = 16 输出: [ "What must be", "acknowledgment ", "shall be " ] 解释: 注意最后一行的格式应为 "shall be " 而不是 "shall be", 因为最后一行应为左对齐,而不是左右两端对齐。 第二行同样为左对齐,这是因为这行只包含一个单词。
解答:这对应于office或者其他文档编辑器的排版方式,很有用途。
具体逻辑如下:
【1】用向量len记录各字符串的长度;
【2】令 sum = -1。若 sum += len 后 sum > maxWodth,则进行判断,并插入第一个字符串;
【3】若num == 0, 即只有一个字符串,用line来表示;否则计算 d = delta/num, p = delta%num;
【4】插入line并置初始量
【5】判断最后一行,单词间隔为' ',最后结尾需要加上间隔maxWidth - sum:
//68 vector<string> fullJustify(vector<string>& words, int maxWidth) { vector<string> res; vector<int> len; int num=-1,sum=-1; int i, curr; for(string str: words) { if(str.size() > maxWidth) return res; len.push_back(str.size());//记录各字符串长度 } for(i=0,curr=i;i<words.size();i++) { int d,p; if(sum+len[i]+1 <= maxWidth) { sum= sum+len[i]+1; num++;// n+1个有效字符 continue; } string line{}; line.insert(line.begin(),words[curr].begin(),words[curr].end()); if(num==0) line.insert(line.end(),maxWidth-len[curr],' '); else { d = (maxWidth-sum)/num;//字符间可以增加空格数 p = (maxWidth-sum)%num;//前p个字符可以增加一个空格 for(int j=0;j<num;j++) { curr++; if(j<p) line.insert(line.end(),d+2,' '); else line.insert(line.end(),d+1,' '); line.insert(line.end(),words[curr].begin(),words[curr].end()); } } res.push_back(line); num = -1; sum = -1; swap(i,curr); } sum = -1; if(curr<words.size()) { string line{}; for(;curr<words.size();curr++) { sum = sum + len[curr]+1; line = line + " " + words[curr]; } line.insert(line.end(),maxWidth-sum,' '); res.push_back(line.substr(1)); } return res; }//68