美文网首页
LeetCode-Text Justification

LeetCode-Text Justification

作者: 圣地亚哥_SVIP | 来源:发表于2018-10-31 22:57 被阅读0次

    这是一个文本对其的功能,给定一个单词数组,及指定的宽度,具体要求如下:

    1. 每一行包含整数个单词,每行两边对齐,其中空格要尽量在单词间分布均匀;
    2. 只包含一个单词的左对齐;
    3. 最后一行无需对齐,左对齐即可

    解决思路:
    1 先遍历单词组,记录每行可以容纳的单词个数,及这些单词正常连接的长度;
    2 根据记录的单词个数,及正常长度,计算每行每个单词间应该添加的空格数目

    以下是AC的代码:

    class Solution {
    public:
        vector<string> fullJustify(vector<string>& words, int maxWidth) {
            vector<tuple<int,int>> count;
            vector<string> res;
            int cnt = 1;
            int len = words[0].size();
            /*
            * 计算每行应该包含的单词个数,及这些单词组合后的长度(单词间的一个空格需要考虑进去)
            * 用元组的格式记录
            */
            for (int index=1;index<words.size();++index){
                if (len + words[index].size()+cnt > maxWidth){
                    //cnt表示个数,cnt-1表示空格数
                    count.push_back(make_tuple(len+cnt-1,cnt));
                    len = words[index].size();
                    cnt = 1;
                }else{
                    len+=words[index].size();
                    cnt++;
                }
            }
            count.push_back(make_tuple(len+cnt-1,cnt));
            int index = 0;
            for (int pos=0;pos<count.size();pos++){
                int len = std::get<0>(count[pos]);
                int cnt = std::get<1>(count[pos]);
                //std::cout<<"Tuple: "<<len<<","<<cnt<<std::endl;
                if (cnt == 1){
                    string tmp = words[index];
                    tmp.append(maxWidth-len,' ');
                    res.push_back(tmp);
                    index++;
                    continue;
                }
                //even表示每个单词间空格的基数
                //left:从左至右每个间隔依次加一个,直至加完
                int even = (maxWidth-len)/(cnt-1);
                int left = (maxWidth-len)%(cnt-1);
                string line="";
                //处理最后一行
                if (pos == count.size()-1){
                    for (int ofs=0;ofs<cnt;ofs++){
                        line = line + words[index+ofs];
                        if (ofs < cnt-1)
                            line.append(1,' ');
                    }
                    line.append(maxWidth-len,' ');
                }else{
                    for (int ofs=0;ofs<cnt;ofs++){
                        line = line + words[index+ofs];
                        if (ofs < cnt-1)
                            line.append(1+even,' ');
                        if (left > 0){
                            line.append(1,' ');
                            left--;
                        }
                    }
                }
                res.push_back(line);
                index = index+cnt;
            }
            return res;
                
        }
    };
    

    相关文章

      网友评论

          本文标题:LeetCode-Text Justification

          本文链接:https://www.haomeiwen.com/subject/tdgztqtx.html