• (描述需要改进)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




  • 相关阅读:
    c++中sort()及qsort()的用法总结
    POJ的层次感分类
    DFS练习-HDU1010
    Dijkstra&&Floyd
    DFS练习一---HDU 1342
    快速幂取模算法
    树的实现
    C++的队列和pair
    BFS练习-POJ.2386
    Codeforces 1139E(二分图最大匹配)
  • 原文地址:https://www.cnblogs.com/2Bthebest1/p/10834991.html
Copyright © 2020-2023  润新知