leetcode68——Text Justification

题目大意:给出字符串数组,将他们组成符合字符数要求的句子字符串,储存进答案中,句子中的单词之间至少有一个空格,如果只有一个单词,则让这个单词左对齐,不满字符数要求的用空格补全,否则就让空格平均分布在单词之间使得句子字符数达到要求。末行要求单词之间只有一个空格,左对齐剩余部分用空格补全。

分析:字符串考察。

          第一步,讨论非末行单词组合: 

         (1)若该组只包含一个单词,规定其左对齐,不足指定长度以空格填充; 
         (2)若该组包含count个单词,那么它有(count-1)个间隔,每个间隔放置一个空格;此时,求出不足指定长度需要的额外空格数目,extraSpace,每个单词间隔填充extra/(count-1)个空格;此时,若不整除那么前extra%(count-1)个间隔再次填充一个空格;

          第二步,讨论末行单词组合: 
          (1)若只有一个单词,左对齐,不足指定长度以空格填充; 
          (2)若该组有count个单词,那么它有(count-1)个间隔,每个间隔放置一个空格;不足指定长度,末尾填充;

代码:转载自https://www.cnblogs.com/shine-yr/p/5214714.html

class Solution {
public:
    vector<string> fullJustify(vector<string>& words, int maxWidth) {
        int sz = words.size();
        vector<string> ret;
        vector<string> tmp;
        int sumLen = 0, count = 0; //sumLen记录当前字符串长度,count记录包含的单词个数
        for (int i = 0; i < sz; ++i) {
            if ((sumLen + words[i].length() + count) <= maxWidth) { //可以添加一个单词
                ++count;
                sumLen = sumLen + words[i].length();
                tmp.push_back(words[i]);
                continue;
            }//if
            else {  //第i个添加不进来时
                if (1 == count) { //只有一个单词时,左对齐
                    string str = tmp[0];
                    while (str.length() < maxWidth)
                        str += " ";
                    ret.push_back(str);
                }//if
                else { //一行有多个单词时
                    string str = "";
                    int extraSpace = maxWidth - sumLen - count + 1; //计算多余的空格总数
                    int everySpace = extraSpace / (count - 1); //每个间隔需再增加的间隔数
                    int frontSpace = extraSpace % (count - 1); //前多少个间隔需要额外多放置一个空格
                    for (int k = 0; k < count - 1; ++k) { //在count-1个间隔中,每个都增加everySpace+1个空格
                        int j = 0;
                        while (j < everySpace + 1) {
                            tmp[k] += " ";
                            ++j;
                        }//while
                    }//for
                    for (int k = 0; k < frontSpace; ++k) { //前frontSpace个间隔需要再放一个空格
                        tmp[k] += " ";
                    }
                    for (int k = 0; k < count; ++k) { //连接这些字符串
                        str += tmp[k];
                    }//for
                    ret.push_back(str);
                }//else
            }//else
            tmp.clear();  //准备处理下一行
            count = 0;
            sumLen = 0;
            --i;
        }//for
        //i遍历结束时一定没有进行上面for循环中的else部分,因为长度一直够用,否则就不是末行了
        if (1 == count) {  //处理末行
            string str = tmp[0];
            while (str.length() < maxWidth)
                str += " ";
            ret.push_back(str);
        }//if
        if (count > 1) {
            string str = "";
            for (int k = 0; k < count - 1; ++k) { //末行的每个单词间放一个空格,其余空格放在尾部
                str = str + tmp[k] + " ";
            }//for
            str += tmp[count - 1];
            while (str.length() < maxWidth)
                str += " ";
            ret.push_back(str);
        }//else     
        return ret;
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值