(描述需要改进)Leetcode No.68 **

给定一个单词数组和一个长度 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

 





posted @ 2019-05-08 22:01  andyalgorithm  阅读(201)  评论(0编辑  收藏  举报