Text Justification

做完此题意味着刷完第一遍leetcode!!!撒花!!!

这一题需要注意两个点[1]:

a、当该行只放一个单词时,空格全部在右边;

 b、最后一行中单词间只有一个空格,其余空格全部在右边。然后只要贪心选择,在一行中尽量放多的单词。

还有注意均匀分摊空格(先除整,然后再分摊余数)。

class Solution {
private:
    void addSpace(string &str, int count) {
        for(int i=1;i<=count;i++)
            str.push_back(' ');
    }

public:
    vector<string> fullJustify(vector<string> &words, int L) {
        vector<string> ret;
        int len=words.size(),begin=0;
        
        while(begin<len)
        {
            int lineLen=0,end=begin;
            while(end<len && lineLen+words[end].size()<=L)
            {
                lineLen+=(words[end].size()+1);
                end++;
            }
            if(end-begin==1)
            {
                ret.push_back(words[begin]);
                addSpace(ret.back(),L-words[begin].size());
                begin=end;
                continue;
            }
            
            int charsLen=lineLen-(end-begin);
            int meanSpace=end<len ? (L-charsLen)/(end-begin-1) : 1;
            int leftSpace=end<len ? (L-charsLen)%(end-begin-1) : L-charsLen-(end-begin-1);
            
            string tmp;
            for(int i=begin;i<end-1;i++)
            {
                tmp+=words[i];
                addSpace(tmp,meanSpace);
                if(end<len && leftSpace>0) //均匀分摊空格
                {
                    tmp.push_back(' ');
                    leftSpace--;
                }
            }
            tmp+=words[end-1];
            if(end>=len)
                addSpace(tmp,leftSpace);
            ret.push_back(tmp);
            begin=end;
        }
        return ret;
    }
};


参考:

[1] http://www.cnblogs.com/TenosDoIt/p/3475275.html



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值