当前位置: 首页 > news >正文

LeetCode.68文本左右对齐

问题描述

给定一个单词数组 words 和一个长度 maxWidth ,重新排版单词,使其成为每行恰好有 maxWidth 个字符,且左右两端对齐的文本。

你应该使用 “贪心算法” 来放置给定的单词;也就是说,尽可能多地往每行中放置单词。必要时可用空格 ' ' 填充,使得每行恰好有 maxWidth 个字符。

要求尽可能均匀分配单词间的空格数量。如果某一行单词间的空格不能均匀分配,则左侧放置的空格数要多于右侧的空格数。

文本的最后一行应为左对齐,且单词之间不插入额外的空格。

注意:

  • 单词是指由非空格字符组成的字符序列。
  • 每个单词的长度大于 0,小于等于 maxWidth
  • 输入单词数组 words 至少包含一个单词。

解题思路

步骤一:行的构建

首先,我们需要确定每行可以包含哪些单词。从当前索引开始,尽可能多地添加单词到当前行,直到添加下一个单词会使行长度超过 maxWidth。这个过程中,我们需要计算已包括的单词总长度加上必要的最小空格数(每两个单词之间至少一个空格)。

步骤二:计算空格

一旦确定了可以放在同一行的单词,接下来需要计算这些单词之间应分配多少空格:

  • 非最后一行: 若行中有多于一个单词,需要将可用空格数(maxWidth 减去当前行单词字符总数)均匀分配到单词间隙中。如果空格数不能被均匀分配,多出的空格应从左到右依次分配。
  • 最后一行: 单词之间只放一个空格,行尾用空格填充至 maxWidth

步骤三:构建字符串

根据计算出的空格数构建每一行的字符串。对于非最后一行,每两个单词之间添加计算出的空格数。对于最后一行,单词之间添加一个空格,然后在行末添加足够的空格以达到 maxWidth

代码实现

class Solution {
public:vector<string> fullJustify(vector<string>& words, int maxWidth) {vector<string> result;int n = words.size();int index = 0;while (index < n) {// 确定当前行可以包含的单词数量。int lineLength = words[index].size();int last = index + 1;while (last < n &&lineLength + words[last].size() + 1 <= maxWidth) {lineLength += words[last].size() + 1; // +1 是因为单词之间的空格last++;}// 构建当前行。string line = words[index];int numWordsInLine = last - index;// 如果是最后一行或者行中只有一个单词。if (last == n || numWordsInLine == 1) {for (int i = index + 1; i < last; i++) {line += " " + words[i];}line += string(maxWidth - line.length(),' '); // 填充行尾空格以满足最大宽度} else {// 不是最后一行并且行中有多个单词。int totalSpaces =maxWidth - (lineLength -(numWordsInLine -1)); // 减去在 lineLength 计算中已经计数的空格int spacesBetweenWords = totalSpaces / (numWordsInLine - 1);int extraSpaces = totalSpaces % (numWordsInLine - 1);for (int i = index + 1; i < last; i++) {int spacesToApply =spacesBetweenWords + (i - index <= extraSpaces ? 1 : 0);line += string(spacesToApply, ' ') + words[i];}}result.push_back(line);index = last;}return result;}
};

相关文章:

  • 无偏归一化自适应心电ECG信号降噪方法(MATLAB)
  • 2024暑假集训第四次考试(终极测试)
  • git-extras
  • 【AI-小米机器狗】Dockerfile包含SSH和SFTP
  • ASP.NET Core 6.0 使用 Action过滤器
  • 【笔记】字符串相似度代码分享
  • 重塑通信边界,基于ZYNQ7000 FPGA驱动的多频段多协议软件无线电平台
  • 腾讯课堂即将停止服务?来试试这款开源的知识付费系统
  • strcpy,srtcmp,strlen函数漏洞利用
  • 鸿蒙OS开发者高级学习第2课:自由流转(含习题答案)
  • Linux学习笔记(一)
  • 若依 Vue 前端分离 3.8.8 版中生成的前端代码中关于下拉框只有下拉箭头的问题
  • 【Mathematica14.0】快速从下载安装到使用
  • 前端git约定式规范化提交-commitizen
  • 贪吃蛇——C语言(VS2022含源代码,及源代码zip文件)
  • “大数据应用场景”之隔壁老王(连载四)
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • Angular 2 DI - IoC DI - 1
  • Angular6错误 Service: No provider for Renderer2
  • Apache的80端口被占用以及访问时报错403
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • JavaScript 基本功--面试宝典
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • JavaScript中的对象个人分享
  • java多线程
  • laravel 用artisan创建自己的模板
  • log4j2输出到kafka
  • PhantomJS 安装
  • python_bomb----数据类型总结
  • Redis学习笔记 - pipline(流水线、管道)
  • select2 取值 遍历 设置默认值
  • Swoft 源码剖析 - 代码自动更新机制
  • webpack入门学习手记(二)
  • Web标准制定过程
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • 技术发展面试
  • 你真的知道 == 和 equals 的区别吗?
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 网页视频流m3u8/ts视频下载
  • 我这样减少了26.5M Java内存!
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • ionic异常记录
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • 大数据全解:定义、价值及挑战
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • 数据库巡检项
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • #pragma multi_compile #pragma shader_feature
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (24)(24.1) FPV和仿真的机载OSD(三)
  • (超简单)使用vuepress搭建自己的博客并部署到github pages上
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (附源码)spring boot基于小程序酒店疫情系统 毕业设计 091931