码迷,mamicode.com
首页 > 其他好文 > 详细

leetcode第一刷_Text Justification

时间:2014-05-13 00:16:01      阅读:341      评论:0      收藏:0      [点我收藏+]

标签:c++   leetcode   算法   

这个题的接受率好低,搞得我一直不敢做。后来认真的看了一下题目,不是很难嘛,字符串的题目ac率就是低,除了难,还因为它的测试用例太多。

思路不难,主要是因为特殊情况太多。纯模拟,我把所有的情况罗列一下,仔细一点的话就能写好了。

1. 当word为空,也就是""时,应该返回一行跟L数目相等的空格。这种情况需要提前判断和处理。

2. 当当前行不是最后一行时,应该尽可能多的放单词,单词不能截断,在这一行上,单词应该分布的尽可能均匀,且要把这一行填满,效果就跟word排版里面的撑满整行很像。怎样实现这个功能呢?我的做法是先确定这一行中能放多少个单词,注意计算的时候,要在单词之间插入一个空格。然后看看这一行中一共需要插入多少个空格(L-单词的总长度),用 总的空格数/(单词数-1),就知道每个单词之间至少插入多少个空格,如果还有剩余(总空格数%(单词数-1)),就从左往右,每次填上一个,用完为止。

还有一种情况,如果这一行中只能放一个单词,要把这个单词放在最左边,然后添加空格到L长度。

3. 如果当前行是最后一行,那么要将单词尽可能的往左边排列,单词之间插入一个空格。右侧用空格填充到L。

怎样知道当前行是不是最后一行呢,我的方法是每次确定单词范围时,看看这个范围的尾部是不是word的结尾。

class Solution {
public:
    vector<string> fullJustify(vector<string> &words, int L) {
        int msize = words.size();
        int i=0, j, part, tpl;
        vector<string> res;
        if(words[0] == ""){
            string s(L, ‘ ‘);
            res.push_back(s);
            return res;
        }
        string tpline, spspace;
        while(i<msize){
            part = 1;
            tpl = words[i].length();
            j = i+1;
            while(j<msize&&tpl+words[j].length()+part<=L){
                tpl += words[j].length();
                ++part;
                ++j;
            }
            --part;
            tpline = words[i];
            if(j != msize&&part!=0){
                int spaces = L-tpl;
                int extraspace = spaces%part;
                int spa=spaces/part;
                string sspace(spa, ‘ ‘);
                for(int k=i+1;k<j;k++){
                    spspace = sspace;
                    if(extraspace>0){
                        spspace += " ";
                        --extraspace;
                    }
                    tpline += spspace + words[k];
                }
                res.push_back(tpline);
            }else{
                for(int k=i+1;k<j;k++){
                    tpline += " " + words[k];
                }
                int l=tpline.length();
                for(int k=0;k<L-l;k++)
                	tpline += " "; 
                res.push_back(tpline);
            }
            //cout<<tpline<<endl;
            i = j;
        }
        return res;
    }
};


leetcode第一刷_Text Justification,布布扣,bubuko.com

leetcode第一刷_Text Justification

标签:c++   leetcode   算法   

原文地址:http://blog.csdn.net/u012792219/article/details/25596461

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!