题目

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. logstash 1.5.3 配置使用redis做续传

    logstash是ELK中的一员大将, redis插件也是<The Logstash Book>中介绍的一个很好用的玩意儿. 之前,用比较小的集群部署的时候,没有介入redis中间件,所以 ...

  2. git 强制回退服务器上的commit

    假设你有3个commit如下: commit 3 commit 2 commit 1   其中最后一次提交commit 3是错误的,那么可以执行: git reset --hard HEAD~1 你会 ...

  3. 黑马程序员_JAVA之交通灯管理系统

    ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 1.一.需求:模拟实现十字路口的交通灯管理系统逻辑,具体需求如下:  1.异步随机生成按照各个路 ...

  4. Protractor

    官网地址:http://www.protractortest.org/ 1. 预备环境 protractor 是一个 Node.js 程序,为了运行 protractor ,你首先需要 Node 环境 ...

  5. oracle中的case when then else end 用法

    Case when 的用法,简单Case函数 简单CASE表达式,使用表达式确定返回值. 语法: CASE search_expression WHEN expression1 THEN result ...

  6. ORCLE数据库导出导入

    从一个用户导出用户所有结构数据 再导入另一个用户里面 ORACLE导出用户下的数据库  exp 命令 用户名/密码服务名 文件地址  owner=(用户名)exp COM_HIOSC_OLD/COM_ ...

  7. java获取服务器所有信息

    package com.sinosoft.outher.listener; import java.net.InetAddress;import java.net.UnknownHostExcepti ...

  8. SPI线协议详解

    更多的内容可以参考 https://en.wikipedia.org/wiki/Serial_Peripheral_Interface_Bus SPI的工作模式: CPOL.CPHA的搭配可以有四种工 ...

  9. 配置高可用的Hadoop平台

    1.概述 在Hadoop2.x之后的版本,提出了解决单点问题的方案--HA(High Available 高可用).这篇博客阐述如何搭建高可用的HDFS和YARN,执行步骤如下: 创建hadoop用户 ...

  10. Windows Server 2003/2008 单网卡搭建VPN

    Windows Server 2003/2008 单网卡搭建VPN 1.打开[控制面板] --> [管理工具] --> [路由和远程访问] 2.鼠标右击你要管理的电脑 在弹出式菜单中选中[ ...