LeetCode: Text Justification 解题报告
Text Justification
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. "
]
Note: Each word is guaranteed not to exceed L in length.

SOLUTION 1:
递归解答:
每一次只处理一行,其它行交给下一级递归来处理。
思路是:
1. 先贪心法取得我们这一行可以放多少单词。
2. 在每个单词后面计算空格1个,但最后一个的要加回来。因为最后一个单词不需要加空格在右边。
3. 余下的空格数,平均分配给所有的interval。
4. 如果不能取整,多出的从左到右分配给那些interval。
5. 如果是1个单词,或是最后一行,在最后补空格。
其实整个题目不算难。但很繁杂,起码提交了8,9次才算过。
public class Solution {
public List<String> fullJustify(String[] words, int L) {
List<String> ret = new ArrayList<String>();
if (words == null) {
return ret;
}
rec(words, L, 0, ret);
return ret;
}
public static void rec(String[] words, int L, int index, List<String> list) {
int len = words.length;
if (index >= len) {
return;
}
int LenTmp = L;
int end = index;
for (int i = index; i < len && words[i].length() <= L; i++) {
L -= words[i].length();
// the space follow the word.
L--;
end = i;
}
// 最后一个空格收回
L++;
// Count how many words do we have.
int num = end - index + 1;
int extraSpace = 0;
int firstExtra = 0;
// 单词数大于1,才需要分配,否则所有的空格加到最后即可
if (num > 1) {
extraSpace = L / (num - 1);
// 首单词后多跟的空格
firstExtra = L % (num - 1);
}
StringBuilder sb = new StringBuilder();
for (int i = index; i <= end; i++) {
sb.append(words[i]);
// The space following every word.
if (i != end) {
sb.append(' ');
}
// 不是最后一行
if (end != len - 1) {
// The first words.
if (firstExtra > 0) {
sb.append(' ');
firstExtra--;
}
// 最后一个单词后面不需要再加空格
if (i == end) {
break;
}
// 每个单词后的额外空格
int cnt = extraSpace;
while (cnt > 0) {
sb.append(' ');
cnt--;
}
}
}
// 最后一行的尾部的空格
int tailLen = LenTmp - sb.length();
while (tailLen > 0) {
sb.append(' ');
tailLen--;
}
list.add(sb.toString());
rec(words, LenTmp, end + 1, list);
}
}
SOLUTION 2:
其实之前的递归是一个尾递归,我们可以很容易地把尾递归转化为Iteration的解法。
以下是Iteration的解法:
思想是一致的。
// SOLUTION 2: iteration.
public List<String> fullJustify(String[] words, int L) {
List<String> ret = new ArrayList<String>();
if (words == null) {
return ret;
} int len = words.length;
int index = 0; while (index < len) {
int LenTmp = L; int end = index;
for (int i = index; i < len && words[i].length() <= LenTmp; i++) {
LenTmp -= words[i].length(); // the space follow the word.
LenTmp--;
end = i;
} // 最后一个空格收回
LenTmp++; // Count how many words do we have.
int num = end - index + 1; int extraSpace = 0;
int firstExtra = 0; // 单词数大于1,才需要分配,否则所有的空格加到最后即可
if (num > 1) {
extraSpace = LenTmp / (num - 1);
// 首单词后多跟的空格
firstExtra = LenTmp % (num - 1);
} StringBuilder sb = new StringBuilder();
for (int i = index; i <= end; i++) {
sb.append(words[i]); // The space following every word.
if (i != end) {
sb.append(' ');
} // 不是最后一行
if (end != len - 1) {
// The first words.
if (firstExtra > 0) {
sb.append(' ');
firstExtra--;
} // 最后一个单词后面不需要再加空格
if (i == end) {
break;
} // 每个单词后的额外空格
int cnt = extraSpace;
while (cnt > 0) {
sb.append(' ');
cnt--;
}
}
} // 最后一行的尾部的空格
int tailLen = L - sb.length();
while (tailLen > 0) {
sb.append(' ');
tailLen--;
} ret.add(sb.toString());
index = end + 1;
} return ret;
}
SOLUTION 3:
参考http://www.ninechapter.com/solutions/text-justification/
在solution2的基础上进行了一些简化,把append word的函数独立出来,解答如下,更加简洁:
// SOLUTION 3: iteration2
public List<String> fullJustify(String[] words, int L) {
List<String> ret = new ArrayList<String>();
if (words == null) {
return ret;
} int len = words.length;
int index = 0; while (index < len) {
int LenTmp = L; int end = index;
for (int i = index; i < len && words[i].length() <= LenTmp; i++) {
LenTmp -= words[i].length(); // the space follow the word.
LenTmp--;
end = i;
} // 最后一个空格收回
LenTmp++; // Count how many words do we have.
int num = end - index + 1; int extraSpace = 0;
int firstExtra = 0; // 单词数大于1,才需要分配,否则所有的空格加到最后即可
if (num > 1) {
extraSpace = LenTmp / (num - 1);
// 首单词后多跟的空格
firstExtra = LenTmp % (num - 1);
} StringBuilder sb = new StringBuilder();
for (int i = index; i <= end; i++) {
sb.append(words[i]); int cnt = 0; if (i == end) {
break;
} // 不是最后一行
if (end != len - 1) {
// The first words.
if (firstExtra > 0) {
cnt++;
firstExtra--;
} // 最后一个单词后面不需要再加空格
// 每个单词后的额外空格
cnt += extraSpace;
} // 1: 每个单词后本来要加的空格
appendSpace(sb, cnt + 1);
} // 最后一行的尾部的空格,或者是只有一个单词的情况
appendSpace(sb, L - sb.length()); ret.add(sb.toString());
index = end + 1;
} return ret;
} public void appendSpace(StringBuilder sb, int cnt) {
while (cnt > 0) {
sb.append(' ');
cnt--;
}
}
GITHUB:
https://github.com/yuzhangcmu/LeetCode_algorithm/blob/master/string/FullJustify.java
LeetCode: Text Justification 解题报告的更多相关文章
- LeetCode: Combination Sum 解题报告
Combination Sum Combination Sum Total Accepted: 25850 Total Submissions: 96391 My Submissions Questi ...
- [leetcode]Text Justification @ Python
原题地址:https://oj.leetcode.com/problems/text-justification/ 题意: Given an array of words and a length L ...
- 【LeetCode】Permutations 解题报告
全排列问题.经常使用的排列生成算法有序数法.字典序法.换位法(Johnson(Johnson-Trotter).轮转法以及Shift cursor cursor* (Gao & Wang)法. ...
- [LeetCode] Text Justification 文本左右对齐
Given an array of words and a length L, format the text such that each line has exactly L characters ...
- LeetCode - Course Schedule 解题报告
以前从来没有写过解题报告,只是看到大肥羊河delta写过不少.最近想把写博客的节奏给带起来,所以就挑一个比较容易的题目练练手. 原题链接 https://leetcode.com/problems/c ...
- LeetCode:Text Justification
题目链接 Given an array of words and a length L, format the text such that each line has exactly L chara ...
- LeetCode: Sort Colors 解题报告
Sort ColorsGiven an array with n objects colored red, white or blue, sort them so that objects of th ...
- [Leetcode] text justification 文本对齐
Given an array of words and a length L, format the text such that each line has exactly L characters ...
- [LeetCode] Text Justification words显示的排序控制
Given an array of words and a length L, format the text such that each line has exactly L characters ...
随机推荐
- jquery获取td所在的行和列
今天在做项目时.遇到一个须要获取第几行第几列的问题. 后来.网上找了找资料,整理了此文.(使用jquery的preAll()获取列) 代码例如以下: <!DOCTYPE html PUBLIC ...
- C#:设置焦点在最小的TabIndex控件上
private void FocusFirstTabIndex(Control container) { // init search result varialble Control searchR ...
- 很幽默的讲解六种Socket IO模型
很幽默的讲解六种Socket IO模型 本文简单介绍了当前Windows支持的各种Socket I/O模型,如果你发现其中存在什么错误请务必赐教. 一:select模型二:WSAAsyncSelect ...
- python实现的电影票房数据可视化
代码地址如下:http://www.demodashi.com/demo/14275.html 详细说明: Tushare是一个免费.开源的python财经数据接口包.主要实现对股票等金融数据从数据采 ...
- C-C和指针作业题(第一章)
在Linux下输入EOF使用Ctrl+D, Windows下输入EOF使用Ctrl+Z 编写一个程序,从标准输入读取几行输入,每行输入都要打印到标准输出上,前面要加上行号,在编写这个程序时要试图让程序 ...
- HDUOJ-----1085Holding Bin-Laden Captive!
Holding Bin-Laden Captive! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Ja ...
- HDUOJ---Hamming Distance(4712)
Hamming Distance Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others) ...
- App上架重磅通知:App Store安全新规17年1月生效
作者:沙铭 来源:公众号 沙铭世界观 ID:mobview 做推广的也许并不了解什么是ATS(App Transport Security),不过这却是一个定时炸弹,引爆点在2016年底,后果就是你不 ...
- OAF_OAF控件系列7 - Tree的实现(案列)
2014-06-02 Created By BaoXinjian
- 关于JavaScript中name的意义冲突
在昨天的<Javascript权威指南>学习笔记之十:ECMAScript 5 增强的对象模型一文中,对于一段代码的调试出现了一个奇怪现象,现将源码贴在以下: <script typ ...