LeetCode-Text Justification

2018-10-31  本文已影响0人  圣地亚哥_SVIP

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

  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;
            
    }
};
上一篇下一篇

猜你喜欢

热点阅读