首页 > 其他分享 >力扣68. 文本左右对齐

力扣68. 文本左右对齐

时间:2024-07-23 14:24:39浏览次数:9  
标签:单词 right maxWidth int 力扣 words 68 对齐 空格

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

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

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

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

注意:

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

示例 1:

输入: words = ["This", "is", "an", "example", "of", "text", "justification."], maxWidth = 16
输出:
[
   "This    is    an",
   "example  of text",
   "justification.  "
]

示例 2:

输入:words = ["What","must","be","acknowledgment","shall","be"], maxWidth = 16
输出:
[
  "What   must   be",
  "acknowledgment  ",
  "shall be        "
]
解释: 注意最后一行的格式应为 "shall be    " 而不是 "shall     be",
     因为最后一行应为左对齐,而不是左右两端对齐。       
     第二行同样为左对齐,这是因为这行只包含一个单词。

示例 3:

输入:words = ["Science","is","what","we","understand","well","enough","to","explain","to","a","computer.","Art","is","everything","else","we","do"],maxWidth = 20
输出:
[
  "Science  is  what we",
  "understand      well",
  "enough to explain to",
  "a  computer.  Art is",
  "everything  else  we",
  "do                  "
]

提示:

  • 1 <= words.length <= 300
  • 1 <= words[i].length <= 20
  • words[i] 由小写英文字母和符号组成
  • 1 <= maxWidth <= 100
  • words[i].length <= maxWidth
class Solution {
    string blank(int n) { return string(n, ' '); } // 创建一个由n个空格组成的字符串
    string join(vector<string>& words, int left, int right, string sep) { // 将单词数组中[left, right)的元素用sep字符串连接起来
        string s = words[left];
        for (int i = left + 1; i < right; i++) {
            s += sep + words[i];
        }
        return s;
    }

public:
    vector<string> fullJustify(vector<string>& words, int maxWidth) {
        vector<string> ans;
        int right = 0, n = words.size();
        while (true) {
            int left = right;
            int sumLen = 0;
            while (right < n &&
                   sumLen + words[right].length() + right - left <= maxWidth) {
                sumLen += words[right++].length();
            }
            if (right == n) { // 处理最后一行
                string s = join(words, left, n, " "); // 将剩余的单词用空格连接起来
                ans.emplace_back(s + blank(maxWidth - s.length())); // 将剩余空格添加到行的末尾
                return ans;
            }

            int numWords = right - left;
            int numSpaces = maxWidth - sumLen;
            if (numWords == 1) { // 处理只有一个单词的情况
                ans.emplace_back(words[left] + blank(numSpaces)); // 在单词后面添加剩余的空格
                continue;
            }

            int avgSpaces = numSpaces / (numWords - 1); // 平均每个单词之间的空格数
            int extraSpaces = numSpaces % (numWords - 1); // 余下的空格数

            // 将额外的空格均匀分配给前extraSpaces个单词,剩下的平均分配给每个单词
            string s1 = join(words, left, left + extraSpaces + 1,
                             blank(avgSpaces + 1)); // 拼接额外加一个空格的单词
            string s2 = join(words, left + extraSpaces + 1, right,
                             blank(avgSpaces)); // 拼接其余单词
            ans.emplace_back(s1 + blank(avgSpaces) + s2); // 将结果添加到答案数组中
        }
    }
};
 

首先创建了一个blank函数用于返回n个空格的字符串,然后创建了一个join函数,目的是用sep连接单词。

之后我创造了一个string类型的向量接收答案,right表示当前行的最右边的单词下标,left则表示最左边的单词下标,n存储总共的单词数,接下来进入while循环,初始化left=right,sumLen用于记录该行一共使用了几个字母,先初始化为0,当right<n既还没遍历到最后一个单词,并且目前占用的字母数加接下来要加入的单词字母数加上空格数还没超过该行的最大字符长度时,sumLen加入下一个单词的字符长度,right++,既指向在下一个单词的下标。这样就成功取得了该行的字母总数。

遍历完这一行之后,如果right==n既right已经指向了最后一个单词的下标,也就是现在的这一行就是最后一行了,用s存储剩下的这些单词,并用空格连接,然后将s以及剩下需要的空格加入ans的末尾,返回ans.

用numWords存储该行的单词数目,numSpaces存储该行一共需要补全的空格数目。

如果该行只有一个单词,那么将该单词加入ans最后,并加入剩余需要的空格,跳过本次循环。

用avgSpaces存储平均每两个单词之间的空格数,extraSpaces存储余下的空格数,由于题目要求,如果有余下的空格,则平均分给左边,所以现在创建两个字符串,第一个是左边的字符串,通过join函数用avgSpaces+1个空格将前面extraSpaces+1个单词连接,第二个是右边的字符串,同理用avgSpaces个空格将最后的单词连接,最后连接这两个字符串并加入ans的后面,这里注意,这两个字符串中间也要用空格连接。

标签:单词,right,maxWidth,int,力扣,words,68,对齐,空格
From: https://blog.csdn.net/2301_80345285/article/details/140612545

相关文章

  • OLOR:已开源,向预训练权值对齐的强正则化方法 | AAAI 2024
    随着预训练视觉模型的兴起,目前流行的视觉微调方法是完全微调。由于微调只专注于拟合下游训练集,因此存在知识遗忘的问题。论文提出了基于权值回滚的微调方法OLOR(OnestepLearning,OnestepReview),把权值回滚项合并到优化器的权值更新项中。这保证了上下游模型权值范围的一致性,有......
  • IDEA解决java注释顶格、xml注释右对齐+无空格问题
    先配置java中注释格式: 然后是配置xml中的注释格式:还是CodeStyle,从java往下滑动到xml......
  • RK3568 gps N303-5Q
    修改目录kernel-5.10device/rockchip/rk356x/frameworks/basesystem/coredts配置kernel-5.10&uart4{       status="okay";       pinctrl-0=<&uart4m0_xfer>;+      gnss{+               //compatible="u-blox,ne......
  • 力扣题库合集(2):动态规划(1)
      本文将持续更新~~ hellohello~,这里是绝命Coding——老白~......
  • 简单芯片测试案例(测试机TR6850S/编程语言:C)
    一、待测芯片测试项分析REXTOUT-100uA-100uAOVC20VQVC0.8VIDD+0.2mA0.8V500VKVS15V二、板卡资源选择1、OVCOVC是一种高达8通道的精密测量板,为设备引脚提供电压/电流,并提供测量功能来测量电压/电流。OVC功能类......
  • 力扣LCR 039. 柱状图中最大的矩形
    思路用到了单调栈。由于最大矩形它的高一定是height数组中的其中一个值,那么我们就可以遍历数组height的值再乘上它的宽的最大值WidthMax(宽的最大值后面会讲),然后取最大值就是答案,也就是ans=max(ans,WidthMax*height[x])。那么如何求高为height[x]的宽的最大值WidthMax呢?解题过程......
  • 【动态规划】【官解+整洁度优化+状态压缩-空间优化算法】力扣198.打家劫舍
    你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你不触动警报装置的情况下,一夜......
  • Warning[204-68] 以及 Vivado HLS与Vivado的资源差异
            这篇学习记录起源于项目以ip导出后,在HLS综合(synthesis)资源与Vivado内ip综合(synthesis)存在巨大差异,本文没有数据仅以文字记录。        所有问题均基于VivadoHLS2019.1。目录1、资源差异1.1、首先vivado内的ip综合分为Global和Out-Of-Context两......
  • 力扣-动态规划全解
    目录动态规划斐波那契数列-EASY爬楼梯-EASY使用最小花费爬楼梯-EASY不同路径-Middle不同路径II-Middle不同路径III-HARD整数拆分-MID*不同的二叉搜索树-MID背包问题-理论基础分割等和子集-EASY最后一块石头的重量II-MID目标和-MID*一和零-MID*53-最大子数组和-中等918-环形子数......
  • 力扣6. Z 字形变换
    将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z字形排列。比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排列如下:PAHNAPLSIIGYIR之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"PAHNAPLSIIGYIR"。......