[LeetCode] 68. 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 Lcharacters.
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.
- A line other than the last line might contain only one word. What should you do in this case?
In this case, that line should be left-justified.
将由单词组成的数组,按每行最多L个字符进行对齐调整。
解法:先找到某一行能放下的单词,单词的字母数之和加上单词之间的空格要小于等于L,然后需要补充空格的话在填进去空格。假设有n个单词,那么就会有n-1个间隔,每个间隔的空格数应该是:(L-此行所有单词的长度和)/(n-1)。只用一个单词的话,排好单词在补上空格即可。
参考:喜刷刷
Java:
public List<String> fullJustify(String[] words, int L) {
List<String> res = new ArrayList<>();
int n = words.length;
char[] spaces = new char[L];
Arrays.fill(spaces, ' ');
for(int i=0; i<n; i++) {
int len = words[i].length();
int j = i;
while(i<n-1 && len+1+words[i+1].length()<=L) {
len += 1+words[++i].length();
}
StringBuilder sb = new StringBuilder(words[j]);
if(j == i || i==n-1) {
while(i==n-1 && j < i) {
sb.append(" "+words[++j]);
}
sb.append(spaces, 0, L-sb.length());
} else {
int avg = (L-len)/(i-j);
int rem = (L-len)%(i-j);
while(j < i) {
sb.append(spaces, 0, avg+1);
if(rem-- > 0) sb.append(" ");
sb.append(words[++j]);
}
}
res.add(sb.toString());
}
return res;
}
Python:
class Solution(object):
def fullJustify(self, words, maxWidth):
"""
:type words: List[str]
:type maxWidth: int
:rtype: List[str]
"""
def addSpaces(i, spaceCnt, maxWidth, is_last):
if i < spaceCnt:
# For the last line of text, it should be left justified,
# and no extra space is inserted between words.
return 1 if is_last else (maxWidth // spaceCnt) + int(i < maxWidth % spaceCnt)
return 0 def connect(words, maxWidth, begin, end, length, is_last):
s = [] # The extra space O(k) is spent here.
n = end - begin
for i in xrange(n):
s += words[begin + i],
s += ' ' * addSpaces(i, n - 1, maxWidth - length, is_last),
# For only one word in a line.
line = "".join(s)
if len(line) < maxWidth:
line += ' ' * (maxWidth - len(line))
return line res = []
begin, length = 0, 0
for i in xrange(len(words)):
if length + len(words[i]) + (i - begin) > maxWidth:
res += connect(words, maxWidth, begin, i, length, False),
begin, length = i, 0
length += len(words[i]) # Last line.
res += connect(words, maxWidth, begin, len(words), length, True),
return res
C++:
class Solution {
public:
vector<string> fullJustify(vector<string>& words, int maxWidth) {
int cnt = 0, left = 0;
vector<string> result;
for(int i =0; i< words.size(); i++)
{
cnt += words[i].size();
if(cnt+i-left > maxWidth || i+1==words.size())
{
if(cnt+i-left > maxWidth) cnt -= words[i--].size();
string str = words[left];
for(int j = left+1; j<= i; j++)
{
int m = maxWidth-cnt, n = i-left;
if(i+1==words.size()) str += " ";
else str.append(m/n + (j-left-1<m % n), ' ');
str += words[j];
}
str.append(maxWidth-str.size(), ' ');
result.push_back(str);
left = i+1, cnt = 0;
}
}
return result;
}
};
All LeetCode Questions List 题目汇总
[LeetCode] 68. Text Justification 文本对齐的更多相关文章
- [leetcode]68. Text Justification文字对齐
Given an array of words and a width maxWidth, format the text such that each line has exactly maxWid ...
- leetcode@ [68] Text Justification (String Manipulation)
https://leetcode.com/problems/text-justification/ Given an array of words and a length L, format the ...
- [Leetcode] text justification 文本对齐
Given an array of words and a length L, format the text such that each line has exactly L characters ...
- Text Justification,文本对齐
问题描述:把一个集合的单词按照每行L个字符放,每行要两端对齐,如果空格不能均匀分布在所有间隔中,那么左边的空格要多于右边的空格,最后一行靠左对齐. words: ["This", ...
- Leetcode#68 Text Justification
原题地址 没有复杂的算法,纯粹的模拟题 先试探,计算出一行能放几个单词 然后计算出单词之间有几个空格,注意,如果空格总长度无法整除空格数,前面的空格长度通通+1 最后放单词.放空格,组成一行,加入结果 ...
- [LeetCode] Text Justification 文本左右对齐
Given an array of words and a length L, format the text such that each line has exactly L characters ...
- 【一天一道LeetCode】#68. Text Justification
一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a ...
- Text Justification 文本左右对齐
Given an array of words and a length L, format the text such that each line has exactly L characters ...
- 【LeetCode】68. Text Justification
Text Justification Given an array of words and a length L, format the text such that each line has e ...
随机推荐
- HDU4548美素数——筛选法与空间换时间
对于数论的学习比较的碎片化,所以开了一篇随笔来记录一下学习中遇到的一些坑,主要通过题目来讲解 本题围绕:素数筛选法与空间换时间 HDU4548美素数 题目描述 小明对数的研究比较热爱,一谈到数,脑子里 ...
- UVA1537 Picnic Planning(思维+最小生成树)
将1号点从图中去掉过后,图会形成几个连通块,那么我们首先可以在这些连通块内部求最小生成树. 假设有\(tot\)个连通块,那么我们会从1号点至少选\(tot\)个出边,使得图连通.这时我们贪心地选择最 ...
- mybatis配置打印sql
mybatis配置打印sql: <settings> <setting name="logImpl" value="STDOUT_LOGGING&quo ...
- [TJOI2015]概率论——期望&&母函数
题意 求一个含有 $n$ 个结点的有序二叉树的叶子节点的期望个数.($n \leq 10^9$) 分析 一堆推导..... 得 $ans = \frac{n(n+1)}{2(2n-1)}$ #incl ...
- Codeforces Round #605 (Div. 3) E. Nearest Opposite Parity(最短路)
链接: https://codeforces.com/contest/1272/problem/E 题意: You are given an array a consisting of n integ ...
- 用junit Test Suite来组合测试
在测试过程中,有时可能想一次性运行所有的测试类,或是选择性的运行某些测试类.这样的话我们就可以用TestSuite来统一管理我们的测试类. 比如说我现在有三个测试类:junitTest4,TestCa ...
- Boosting and AdaBoost
Boosting是一种从一些弱分类器中创建一个强分类器的集成技术(提升算法). 它先由训练数据构建一个模型,然后创建第二个模型来尝试纠正第一个模型的错误.不断添加模型,直到训练集完美预测或已经添加到数 ...
- codeforces1276A As Simple as One and Two
C.As Simple as One and Two A. As Simple as One and Two time limit per test 3 seconds memory limit pe ...
- POJ P1985 Cow Marathon 题解
这道题是我们考试的第一题,非常水,就是一个树的直径的板子.详见上一篇博客. #include<iostream> #include<cstdio> #include<cs ...
- 72: libreoj #10147 区间dp
$des$ 将 n 堆石子绕圆形操场排放,现要将石子有序地合并成一堆.规定每次只能选相邻的两堆合并成新的一堆,并将新的一堆的石子数记做该次合并的得分. 请编写一个程序,读入堆数 nnn 及每堆的石子数 ...