Text Justification -- LeetCode

                原题链接:  http://oj.leetcode.com/problems/text-justification/  
这道题属于纯粹的字符串操作,要把一串单词安排成多行限定长度的字符串。主要难点在于空格的安排,首先每个单词之间必须有空格隔开,而当当前行放不下更多的单词并且字符又不能填满长度L时,我们要把空格均匀的填充在单词之间。如果剩余的空格量刚好是间隔倍数那么就均匀分配即可,否则还必须把多的一个空格放到前面的间隔里面。实现中我们维护一个count计数记录当前长度,超过之后我们计算共同的空格量以及多出一个的空格量,然后将当行字符串构造出来。最后一个细节就是最后一行不需要均匀分配空格,句尾留空就可以,所以要单独处理一下。时间上我们需要扫描单词一遍,然后在找到行尾的时候在扫描一遍当前行的单词,不过总体每个单词不会被访问超过两遍,所以总体时间复杂度是O(n)。而空间复杂度则是结果的大小(跟单词数量和长度有关,不能准确定义,如果知道最后行数r,则是O(r*L))。代码如下: 
public ArrayList<String> fullJustify(String[] words, int L) {    ArrayList<String> res = new ArrayList<String>();    if(words==null || words.length==0)        return res;    int count = 0;    int last = 0;    for(int i=0;i<words.length;i++)    {        if(count+words[i].length()+(i-last)>L)        {            int spaceNum = 0;            int extraNum = 0;            if(i-last-1>0)            {                spaceNum = (L-count)/(i-last-1);                extraNum = (L-count)%(i-last-1);            }            StringBuilder str = new StringBuilder();            for(int j=last;j<i;j++)            {                str.append(words[j]);                if(j<i-1)                {                    for(int k=0;k<spaceNum;k++)                    {                        str.append(" ");                    }                    if(extraNum>0)                    {                        str.append(" ");                    }                    extraNum--;                }            }            for(int j=str.length();j<L;j++)            {                str.append(" ");            }                   res.add(str.toString());            count=0;            last=i;        }        count += words[i].length();    }    StringBuilder str = new StringBuilder();    for(int i=last;i<words.length;i++)    {        str.append(words[i]);        if(str.length()<L)            str.append(" ");    }    for(int i=str.length();i<L;i++)    {        str.append(" ");    }    res.add(str.toString());    return res;}
这道题属于那种文本编辑的子操作之类的题目,从算法思路上没有什么特别,不过实现细节还是比较多的,不容易一次做对,可能要多练习几次哈。
           
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值