美文网首页算法
68. 文本左右对齐

68. 文本左右对齐

作者: 红树_ | 来源:发表于2023-05-02 18:04 被阅读0次

参考68. 文本左右对齐 - 力扣(Leetcode)

题目

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

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

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

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

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

解题思路

  • 模拟:考虑模拟一行一行的放置单词,主要处理每行放多少单词以及两端对齐时空格数量的计算,注释代码如下所示。

模拟 0ms

class Solution {
    public List<String> fullJustify(String[] words, int maxWidth) {
        //考虑模拟一行一行的放
        List<String> ans = new ArrayList<>();
        int wordIndex = 0;
        while(wordIndex < words.length) {
            int count = 1,len = words[wordIndex].length();
            for(int i = wordIndex + 1; i < words.length; i++) {
                if(len + 1 + words[i].length() > maxWidth) break;
                len += 1 + words[i].length();
                count ++;
            }
            StringBuilder sb = new StringBuilder();
            if(count == 1) { //只有一个单词
                sb.append(words[wordIndex]);
                //补空格
                for(int i = 0; i < maxWidth - words[wordIndex].length(); i++)
                    sb.append(' ');
            } else if(wordIndex + count == words.length || maxWidth == len) {
                //最后一行 或者刚好间隔一个空格
                for(int i = 0; i < count; i++) {
                    if(sb.length() > 0) sb.append(' ');
                    sb.append(words[wordIndex + i]);
                }
                //补空格
                for(int i = 0,sbLen = sb.length(); i < maxWidth - sbLen; i++)
                    sb.append(' ');
            }else { //两边对齐
                //计算空格长度
                int spaceLen = (maxWidth - len + count - 1)/(count - 1);
                int leftSpace = maxWidth - len + count - 1 - (count - 1) * spaceLen;
                StringBuilder spaces = new StringBuilder(spaceLen);
                for(int i = 0; i < spaceLen; i++)
                    spaces.append(' ');
                for(int i = 0; i < count; i++) {
                    if(sb.length() > 0){
                        sb.append(spaces); //插入空格 和多余空格
                        if(leftSpace-- > 0) sb.append(' ');
                    }
                    sb.append(words[wordIndex + i]);
                }
            }
            ans.add(sb.toString());
            wordIndex += count;
        }
        return ans;
    }
}

复杂度分析

  • 时间复杂度:O(n)n为所有单词长度之和。
  • 空间复杂度:O(k)kStringBuilder使用空间maxWidth

相关文章

  • 68.文本左右对齐

  • LeetCode 力扣 68. 文本左右对齐

    题目描述(困难难度) 一个句子,和一个长度表示一行最长的长度,然后对齐文本,有下边几个规则。 同一个单词只能出现在...

  • python实现leetcode之68. 文本左右对齐

    解题思路 处理每一个单词word单词加入一行时会占用1个空格和len(word)个字符,所以新单词加入后至少需要l...

  • 图片规范

    图片如何与文本对齐? 要使图片与文本对齐,即是说要在可视部分左右各自适量留白,留白的宽度要恰好等于文本的页边距。经...

  • 左右文本,右侧可动态

    前言 如上图,经常会有各种需求,比如右侧文本对齐方式(左右对齐),右侧文本的行数限定(可以限制无限行,也可以限制行...

  • LeetCode - #68 文本左右对齐

    前言 我们社区陆续会将顾毅(Netflix 增长黑客,《iOS 面试之道》作者,ACE 职业健身教练。)的 Swi...

  • 文本

    文本 text text-align: 文本对齐方式left 左对齐center ...

  • bootstrap常用类

    一.文本1)对齐方式text-left 文本左对齐 =======> text-align:...

  • CSS入门2(0719)

    07-19 1.文本设置