题目

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 exactly L 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.”]

L: 16.

Return the formatted lines as:

[

“This is an”,

“example of text”,

“justification. ”

]

分析

给定一个字符串数组以及规定长度,按规则将其分组输出;

题目本身是不难的,主要是规则繁杂:

  1. 首先,输出以是否为末行分为两类;
  2. 对于非末行单词组,又以其包含的单词个数分为两类,一是单个单词,二是多个单词;

第一步,讨论非末行单词组合:

(1)若该组只包含一个单词,规定其左对齐,不足指定长度以空格填充;

(2)若该组包含count个单词,那么它有(count-1)个间隔,每个间隔放置一个空格;此时,求出不足指定长度需要的额外空格数目,extraSpace,每个单词间隔填充extra/(count-1)个空格;此时,若不整除那么前extra%(count-1)个间隔再次填充一个空格;

第二步,讨论末行单词组合:

(1)若只有一个单词,左对齐,不足指定长度以空格填充;

(2)若该组有count个单词,那么它有(count-1)个间隔,每个间隔放置一个空格;不足指定长度,末尾填充;

AC代码

class Solution {
public:
vector<string> fullJustify(vector<string>& words, int maxWidth) {
if (words.empty())
return vector<string>();
vector<string> ret; int sz = words.size(); /*sumLen记录当前字符串长度,count记录包含的单词个数*/
vector<string> tmp;
int sumLen = 0, count = 0;
for (int i = 0; i < sz; ++i)
{
/*判断是否可以添加一个字符串*/
if ((sumLen + words[i].length() + count) <= maxWidth)
{
/*满足要求,单词个数增一,保存*/
++count;
sumLen = sumLen + words[i].length();
tmp.push_back(words[i]);
continue;
}//if
else{
/*只有一个单词,左对齐*/
if (1 == count)
{
string str = tmp[0];
while (str.length() < maxWidth)
str += " ";
ret.push_back(str);
}//if
else{
string str = "";
/*计算多余的空格总数,每个间隔至少一个空格*/
int extraSpace = maxWidth - sumLen - count + 1;
/*每个间隔需再增加的间隔*/
int everySpace = extraSpace / (count - 1);
/*前间隔需要额外放置一个空格的间隔数*/
int frontSpace = extraSpace % (count - 1); for (int k = 0; k < count - 1; ++k)
{
int j = 0;
while (j < everySpace + 1)
{
tmp[k] += " ";
++j;
}//while
}//for
/*前frontSpace个间隔需要再放一个空格*/
for (int k = 0; k < frontSpace; ++k)
{
tmp[k] += " ";
}
/*连接这些字符串*/
for (int k = 0; k < count; ++k)
{
str += tmp[k];
}//for
ret.push_back(str);
}//else
}//else
tmp.clear();
count = 0;
sumLen = 0;
--i;
}//for
/*处理最后一组,也就是尾行*/
/*只有一个单词,左对齐*/
if (1 == count)
{
string str = tmp[0];
while (str.length() < maxWidth)
str += " ";
ret.push_back(str);
}//if if(count > 1){
string str = "";
/*末行的每个单词间放一个空格,其余空格放在尾部*/
for (int k = 0; k < count - 1; ++k)
{
str = str + tmp[k] + " ";
}//for
str += tmp[count - 1];
while (str.length() < maxWidth)
str += " ";
ret.push_back(str);
}//else
return ret;
}
};

GitHub测试程序源码

LeetCode(68) Text Justification的更多相关文章

  1. LeetCode(68):文本左右对齐

    Hard! 题目描述: 给定一个单词数组和一个长度 maxWidth,重新排版单词,使其成为每行恰好有 maxWidth 个字符,且左右两端对齐的文本. 你应该使用“贪心算法”来放置给定的单词:也就是 ...

  2. LeetCode(68)-Compare Version Numbers

    题目: Compare two version numbers version1 and version2. If version1 > version2 return 1, if versio ...

  3. Qt 学习之路 2(68):访问网络(4)

    Home / Qt 学习之路 2 / Qt 学习之路 2(68):访问网络(4) Qt 学习之路 2(68):访问网络(4) 豆子 2013年11月7日 Qt 学习之路 2 19条评论 前面几章我们了 ...

  4. LeetCode(275)H-Index II

    题目 Follow up for H-Index: What if the citations array is sorted in ascending order? Could you optimi ...

  5. LeetCode(220) Contains Duplicate III

    题目 Given an array of integers, find out whether there are two distinct indices i and j in the array ...

  6. LeetCode(154) Find Minimum in Rotated Sorted Array II

    题目 Follow up for "Find Minimum in Rotated Sorted Array": What if duplicates are allowed? W ...

  7. LeetCode(122) Best Time to Buy and Sell Stock II

    题目 Say you have an array for which the ith element is the price of a given stock on day i. Design an ...

  8. LeetCode(116) Populating Next Right Pointers in Each Node

    题目 Given a binary tree struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode * ...

  9. LeetCode(113) Path Sum II

    题目 Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given ...

随机推荐

  1. Jquery 页面间传值(非QuerryString)

    实现原理: 实现方式不是很复杂,父页面A打开一个子页面 A1,并同时写一个带参数的接收数据函数Receive(result),在A1页面进行逻辑操作,然后调用父页面A的Receive(result)函 ...

  2. Android中使用WebView, WebChromeClient和WebViewClient加载网页

    在android应用中,有时要加载一个网页,如果能配上一个进度条就更好了,而android 中提供了其很好的支持, 其中webView的一系列用法,比如 webView.getSettings().s ...

  3. 04.URL路径访问与模块控制器之间的关系

    <?php //初使化,进行加载. //通过这个英文名来了解,他是定义的与thinkphp有关的核心框架文件目录路径 //他可以通过这一个常量,在以后运行的时候都去找这个路径,确保在运行过程当, ...

  4. (NO.00001)iOS游戏SpeedBoy Lite成形记(十一)

    之前的10篇内容主要实现了选手从起点移动至终点的动作,比较随机的模拟了选手的速度变化,另外完成了选手到达终点时该做的事情. 接下来的几篇中我们进一步完善SpeedBoy Lite项目,使它真正成为一个 ...

  5. Python、pip和scrapy的安装——Python爬虫学习笔记1

    Python作为爬虫语言非常受欢迎,近期项目需要,很是学习了一番Python,在此记录学习过程:首先因为是初学,而且当时要求很快速的出demo,所以首先想到的是框架,一番查找选用了Python界大名鼎 ...

  6. XenServer中虚拟机和快照导出与导入

    我们在工作中经常会遇到,把Xenserver中的虚拟机或者快照导出,然后导入到另一台Xenserver,或者导出来备份下来,以防虚拟机出现故障. 下面介绍一下用xe命令如何导出/导入虚拟机或快照,当然 ...

  7. Excel:函数中的万金油:INDEX+SMALL+IF+ROW

      很多人在Excel中用函数公式做查询的时候,都必然会遇到的一个大问题,那就是一对多的查找/查询公式应该怎么写?大多数人都是从VLOOKUP.INDEX+MATCH中入门的,纵然你把全部的多条件查找 ...

  8. 异步IO原理及相应函数

    何为异步IO? (1)几乎可以认为:异步IO就是操作系统用软件实现的一套中断响应系统.(2)异步IO的工作方法是:我们当前进程注册一个异步IO事件(使用signal注册一个信号 SIGIO的处理函数) ...

  9. C语言函数的概念

    在<我们对函数进行了简单的解释,函数(Function)是一段可以重复使用的代码,这是从整体上对函数的认识. C语言本身带了很多库函数,并分门别类地放在了不同的头文件中,使用时只要引入对应的头文 ...

  10. flask综合整理2

    session功能 首先我们知道session可以理解是一把钥匙,它存在在服务器上,其实在flask中也有session 1.系统自带的session from flask import sessio ...