Text Justification

原题链接Text Justification

将以这个字符串数组重组成几行,每个字符串用空格分隔,要求

  • 每行的长度相同
  • 每行的空格需要均匀分配,且每个单词之间至少有一个空格
  • 最后一行尽量将空格放在最后面

首先思路是记录已遍历到的单词的总长度,判断是否还能容纳当前遍历到的这个单词。

  • 如果能,即之前总长度加上这个单词长度以及一个分隔空格没有超过规定长度,继续遍历下一个
  • 如果不能,那么就将之前遍历到的所有单词组成一行,改行需要满足上面三个约束

可以用两个下标指针记录当前遍历到的单词,[front, back)表示这个范围的单词可以组成一行,而加上back后则不能。

难点在计算每个单词之间空格的数量,均匀分布空格的意思是

  • 假设保证每块空格长度相同的前提下还剩余n个空格,那么就将前n块空格的每个空格长度加一

[front, back)表示这个范围有back - front - 1个单词,len记录这个范围的长度(注,这个长度计算了一个空格在里面,即每个单词之间至少有一个空格,这个空格长度计算在len中了)
那么每个单词之间均匀的空格数应该是(maxWidth - len) / (back - front - 1) + 1
+1表示将len中记录的用于分隔的单词加上

但是,对于最后一行,因为要保证空格尽量在后面,其实就是保证每个单词之间只能有一个空格。
所以计算单词之间空格数量的方法为

int spaces = 1;
if(back != words.size() && back != front + 1)
{spaces = (maxWidth - len) / (back - front - 1) + 1;
}

如果back == front + 1,说明这一行只有一个单词,那么分隔为1即可

除了每个单词均匀的空格数之外,如果剩余n个空格,那么需要将前n个空格块每一个都增加一个空格。计算这个n的方法其实就是计算剩余多少个空格

int spaces = 1;
int extra = 0;
if(back != words.size() && back != front + 1)
{spaces = (maxWidth - len) / (back - front - 1) + 1;extra = (maxWidth - len) % (back - front - 1);
}

找到了每个空格块的数量,就可以组成一行的字符串了。不过要注意前extra个空格快的空格数量是spaces + 1
先处理一行中前extra个空格块

res.emplace_back(words[front++]);
while(extra--)
{res.back().append(spaces+1, ' ');res.back().append(words[front++]);
}

再处理该行剩下的空格块

while(front < back)
{res.back().append(spaces, ' ');res.back().append(words[front++]);
}   

此时,这一行字符的总数量已经是maxWidth了,但是考虑到最后一行的情况,上述的space是1而extra为0,追加一遍之后总数量不是maxWidth,因为要将空格尽量放在后面,所以这里需要将剩余的空格追加上

res.back().append((maxWidth - res.back().size()), ' ');

完整代码如下

class Solution {
public:vector<string> fullJustify(vector<string>& words, int maxWidth) {vector<string> res;int back = 0;while(back < words.size()){int front = back;int len = words[back++].size();while(back < words.size() && len + 1 + words[back].size() <= maxWidth){len += 1 + words[back].size();++back;}int spaces = 1;int extra = 0;if(back != words.size() && back != front + 1){spaces = (maxWidth - len) / (back - front - 1) + 1;extra = (maxWidth - len) % (back - front - 1);}res.emplace_back(words[front++]);while(extra--){res.back().append(spaces+1, ' ');res.back().append(words[front++]);}while(front < back){res.back().append(spaces, ' ');res.back().append(words[front++]);}res.back().append((maxWidth - res.back().size()), ' ');}return res;}
};

本题主要难点在确定空格数,逻辑上用while比for循环清晰不少

每天一道LeetCode-----将单词数组分成多行,每行长度相同,单词之间用空格分隔,要求空格尽量均匀分布相关推荐

  1. LeetCode 2035. 将数组分成两个数组并最小化数组和的差

    文章目录 一.题目 1.题目描述 2.基础框架 3.原题链接 二.解题报告 1.思路分析 2.算法详解 3.时间复杂度 4.代码详解 三.本题小知识 四.加群须知 一.题目 1.题目描述   给你一个 ...

  2. LeetCode 1121. 将数组分成几个递增序列

    文章目录 1. 题目 2. 解题 1. 题目 给你一个 非递减 的正整数数组 nums 和整数 K,判断该数组是否可以被分成一个或几个 长度至少 为 K 的 不相交的递增子序列. 示例 1: 输入:n ...

  3. LeetCode 2035. 将数组分成两个数组并最小化数组和的差(状态压缩DP)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个长度为 2 * n 的整数数组. 你需要将 nums 分成 两个 长度为 n 的数组,分别求出两个数组的和,并 最小化 两个数组和之 差的绝对值 ...

  4. LeetCode 1712. 将数组分成三个子数组的方案数(前缀和 + 二分查找)

    文章目录 1. 题目 2. 解题 221 / 3117,前7.1% 574 / 9692,前 5.9% 周赛前2题如下: LeetCode 5641. 卡车上的最大单元数(排序,模拟) LeetCod ...

  5. LeetCode 1013. 将数组分成和相等的三个部分

    1. 题目 给定一个整数数组 A,只有我们可以将其划分为三个和相等的非空部分时才返回 true,否则返回 false. 形式上,如果我们可以找出索引 i+1 < j 且满足 (A[0] + A[ ...

  6. leetcode —— 1013. 将数组分成和相等的三个部分

    给你一个整数数组 A,只有可以将其划分为三个和相等的非空部分时才返回 true,否则返回 false. 形式上,如果可以找出索引 i+1 < j 且满足 (A[0] + A[1] + - + A ...

  7. 去掉数组最后一个元素_leetcode 34. 在排序数组中查找元素的第一个和最后一个位置每天刷一道leetcode算法系列!...

    作者:reed,一个热爱技术的斜杠青年,程序员面试联合创始人 前文回顾: leetcode1. 两数之和--每天刷一道leetcode系列! leetcode2. 两数相加--每天刷一道leetcod ...

  8. c++两个数组对比去掉重复的元素_每日一道 LeetCode (8):删除排序数组中的重复项和移除元素...

    ❝ 每天 3 分钟,走上算法的逆袭之路. ❞ 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub:https://github.com/meteor1993/LeetCode Gi ...

  9. 每日一道 LeetCode (42):旋转数组

    每天 3 分钟,走上算法的逆袭之路. 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub: https://github.com/meteor1993/LeetCode Gitee ...

最新文章

  1. AI视觉组基于ESP32的裁判系统第一版本设计要求
  2. 收集:搜罗或看到的搞笑桥段
  3. 对话英特尔研究院院长:量子计算是马拉松,现在大家(包括谷歌)刚跑出第一英里...
  4. lesson4-Qt窗口
  5. sdh管理单元指针_C语言学习|指针的介绍
  6. 【每日SQL打卡】​​​​​​​​​​​​​​​DAY 6丨寻找用户推荐人【难度简单】
  7. 软件测试项目计划书总结,软件测试项目计划书.doc
  8. 双目立体视觉匹配算法-----SAD匹配算法、BM算法、SGBM算法、GC算法
  9. 翁恺老师C语言学习笔记(十)指针_指针变量就是记录地址的变量
  10. 第 17 章 垃圾回收器
  11. 使用PHP实现请求响应和MySql访问
  12. 在RedHat中安装新字体
  13. 2016年下半年软考网络工程师真题解析精编版
  14. android银行卡号扫描二维码,支付宝扫描银行卡号识别SDK
  15. 华为海思有多么强大?一起来看看它的成就
  16. 认真推荐几个腾讯、滴滴、美团的大佬
  17. 万字长文!用文本挖掘深度剖析54万首诗歌
  18. win10扬声器没有声音但插入耳机有声音
  19. 单元一: 全桥驱动电路(驱动MOS/IGBT均适用,附带硬件)
  20. 三层交换机和三层交换实验

热门文章

  1. 轻量级ORM框架——第二篇:Dapper中的一些复杂操作和inner join应该注意的坑
  2. 数学建模:1.概述 监督学习--回归分析模型
  3. 白盒测试之初识gtest工具
  4. [笔试题目] 美团2015年9月后端开发工程师笔试题
  5. iOS之深入解析内存管理NSTimer的强引用问题
  6. HarmonyOS之在工程中导入Sample工程和添加Module
  7. LeetCode Algorithm 811. 子域名访问计数
  8. 2 0 2 0 年 第 十 一 届 蓝 桥 杯 - 省赛 - CC++大学B组 - B.既约分数
  9. Matrix Studio LeetCode 刷题指南
  10. 100. Same Tree 相同的树