这个题的接受率好低,搞得我一直不敢做。后来认真的看了一下题目,不是非常难嘛。字符串的题目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的更多相关文章

  1. leetcode第一刷_Set Matrix Zeroes

    这个题乍一看非常easy,实际上还挺有技巧的.我最開始的想法是找一个特殊值标记.遇到一个0,把他所相应的行列中非零的元素标记成这个特殊值.0值保持不变,然后再从头遍历一次,碰到特殊值就转化成0. 问题 ...

  2. leetcode第一刷_Permutations II

    当有反复元素的时候呢? 不用拍脑袋都会想到一种方法,也是全部有反复元素时的通用处理方法,维护一个set,假设这个元素没增加过就增加,增加过了的忽略掉.可是,在这道题上这个通用方法竟然超时了! 怎么办? ...

  3. leetcode第一刷_Populating Next Right Pointers in Each Node II

    很自然的推广,假设去掉全然二叉树的条件呢?由于这个条件不是关键,因此不会影响整体的思路.做法依旧是每次找到一层的起点,然后一层一层的走. 假设是全然二叉树的话,每层的起点就是上一层起点的左孩子,兄弟之 ...

  4. leetcode第一刷_Merge Intervals

    看到这个题我就伤心啊,去微软面试的时候,第一个面试官让我做的题目就是实现集合的交操作,这个集合中的元素就像这里的interval一样.是一段一段的.当时写的那叫一个慘不忍睹.最后果然被拒掉了. .好好 ...

  5. leetcode第一刷_N-Queens

    八皇后问题应该是回溯法的教学典范.在本科的时候,有一门课叫面向对象.最后的附录有这个问题的源码.当时根本不懂编程,照抄下来,执行一下出了结果都非常开心,哎. 皇后们的限制条件是不能同行同列,也不能同对 ...

  6. leetcode第一刷_Gray Code

    说到格雷码,应该没人不知道,详细它有什么用,我还真不是非常清楚,我室友应该是专家.生成的规律不是非常明显,之前看到帖子讲的,这会儿找找不到了.. 思想是这种,假设有n位,在第2^(n-1)个编码以下画 ...

  7. leetcode第一刷_Combination Sum Combination Sum II

    啊啊啊啊.好怀念这样的用递归保存路径然后打印出来的题目啊.好久没遇到了. 分了两种,一种是能够反复使用数组中数字的,一种是每一个数字仅仅能用一次的.事实上没有多大差别,第一种每次进入递归的时候都要从头 ...

  8. leetcode第一刷_Count and Say

    水题. 描写叙述的还挺麻烦的,实际上就是纸老虎,用两个string,一个存上一轮的结果,一个用来更新出这一轮的结果,每次扫描上一轮,统计一个字符出现的次数,然后把这个次数和字符增加到这一轮的字符串中就 ...

  9. leetcode第一刷_Jump Game

    这个题事实上非常easy的,我一開始想复杂了,它没要求记录路径,事实上仅仅要看一下每一步之后所能延伸到的最远的位置就能够了,在这一个最远位置前面的那些位置,都是能够到达的,假设扫到了某个i,它大于当前 ...

随机推荐

  1. hdu5321 beautiful set(莫比乌斯反演)

    设\(cnt[i]\)为权值为i的倍数的数的数量. \(f0[i],f1[i]\)分别为两种方法\(gcd=i\)的贡献是i的多少倍. \(F0[i],F1[i]\)分别为两种方法\(gcd\)为\( ...

  2. 斗地主算法的设计与实现(一)--项目介绍&如何定义和构造一张牌

    大学期间,我在别人的基础上,写了一个简易的斗地主程序. 主要实现了面向对象设计,洗牌.发牌.判断牌型.比较牌的大小.游戏规则等算法. 通过这个斗地主小项目的练习,提高了我的面向对象设计能力,加深了对算 ...

  3. 解决jquery动态增加元素后children值没有变的问题

    html代码如下: <ul id="attr_input_panel"> <li> <div class="attr_input_item& ...

  4. 2016 10 26考试 NOIP模拟赛 杂题

    Time 7:50 AM -> 11:15 AM 感觉今天考完后,我的内心是崩溃的 试题 考试包 T1: 首先看起来是个贪心,然而,然而,看到那个100%数据为n <= 2000整个人就虚 ...

  5. 国庆 day 1 下午

    一道图论好题(graph) Time Limit:1000ms   Memory Limit:128MB 题目描述 LYK有一张无向图G={V,E},这张无向图有n个点m条边组成.并且这是一张带权图, ...

  6. Constructor call must be the first statement in a constructor

    super()和this ()不能共存.否则编译时会报异常. Constructorcall must be the first statement in a constructor 换句话说就是su ...

  7. 9-第一个app项目

    <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...

  8. Metasploit的三种启动方式

    不多说,直接上干货! 注意:博主我用的是Kali linux 2016.2(Rolling).  msfcli 的启动 root@kali:~# msfcli -h bash: msfcli: 未找到 ...

  9. feign client传递对象

    http://bbs.springcloud.cn/d/134-feign-client server端申明 @RestController public class HelloController ...

  10. Andoid 更好的Android多线程下载框架

    概述 为什么是更好的Android多线程下载框架呢,原因你懂的,广告法嘛! 本篇我们我们就来聊聊多线程下载框架,先聊聊我们框架的特点: 多线程 多任务 断点续传 支持大文件 可以自定义下载数据库 高度 ...