(每日算法)leetcode--Text Justification(格式化字符串)

32 篇文章 2 订阅

要求:

给定一组字符串,按照给定长度(eg.16)格式化显示,使每一行尽可能多的单词,单词之间的空格均衡-最左侧可以稍多,左右对齐。

最后一行靠左对齐,即最右侧可以没有间隙。

如下面的例子描述:

1)每一行16个字符

2)左右对齐,空格数均衡,最左侧的间隙可以多一个空格

3)单词不可以拆开,最后一行左对齐。

原题描述:

Given an array of words and a length L, format the text such that each line has exactly L characters and is fully (left and right) justified.

You should pack your words in a greedy approach; that is, pack as many words as you can in each line. Pad extra spaces ' ' when necessary so that each line has exactlyL characters.

Extra spaces between words should be distributed as evenly as possible. If the number of spaces on a line do not divide evenly between words, the empty slots on the left will be assigned more spaces than the slots on the right.

For the last line of text, it should be left justified and no extra space is inserted between words.

For example,
words["This", "is", "an", "example", "of", "text", "justification."]
L16.

Return the formatted lines as:

[
   "This    is    an",
   "example  of text",
   "justification.  "
]
代码如下:

vector<string> fullJustify(vector<string> &words, int L) {
     vector<string> result;
     const int n = words.size();
     int begin = 0, len = 0;//当前行的起点, 当前长度
     for(int i = 0; i < n; ++i)
     {
        if( len + words[i].size() + (i - begin) > L)
        {
            //如果加上第i个单词长度超过L,就作为一行添加到结果中
            //i-begin -- 指单词之间必须的一个空格数
            //先统计一行能容纳多少个单词,然后再真正的拼接
            //将words中begin到i-1的i-begin个单词拼接
            result.push_back(connect(words, begin, i-1, len, L, false));
            begin = i;
            len = 0;
        }
        len += words[i].size();//只是起统计这一行长度的作用
     }   
     //将最后一行单独处理
     result.push_back(connect(words, begin, n-1, len, L, true));
     return result;
    }
//参数说明
//begin-开始拼接的索引         end-结束拼接的索引
//len-字母的总个数            is_last-是否是最后一行
string connect(vector<string> &words, int begin, int end, 
                int len, int L, bool is_last)
{
    string s;
    int n = end - begin + 1;//要拼接的单词个数
    for(int i = 0; i < n; ++i)
    {
        s += words[begin + i];
        //添加一个新单词之后要添加空格
        addSpaces(s, i, n - 1, L - len, is_last);
    }
    //L--总共需要添加的空格数
    if(s.size() < L) 
        s.append(L - s.size(), ' ');
    return s;
}
//参数说明
//i-当前空隙的序号    n-空隙总数
//L-总共需要添加的空隙数
void addSpaces(string &s, int i, int n, int L, bool is_last)
{
    if(n < 1 || i > n - 1) return;
    int spaces = is_last ? 1 : (L/n + (i < (L % n) ? 1 : 0));
    s.append(spaces, ' ');
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值