Leetcode——文本左右对齐

Posted Yawn,

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcode——文本左右对齐相关的知识,希望对你有一定的参考价值。

1. 文本左右对齐

(1)暴力模拟

  • 如果当前行只有一个单词,特殊处理为左对齐;
  • 如果当前行为最后一行,特殊处理为左对齐;
  • 其余为一般情况,分别计算「当前行单词总长度」、「当前行空格总长度」和「往下取整后的单位空格长度」,然后依次进行拼接。
    • 当空格无法均分时,每次往靠左的间隙多添加一个空格,直到剩余的空格能够被后面的间隙所均分。
class Solution {
    public List<String> fullJustify(String[] words, int maxWidth) {
        List<String> res = new ArrayList<>();
        List<String> list = new ArrayList<>();
        int len = words.length;
        
        int index = 0;
        while (index < len) {
            //list存放当前行所有word
            list.clear();
            list.add(words[index]);
            int curLen = words[index].length();
            index++;

            //当前单词长度 + 空格 + 下一单词长度 < maxWidth
            while (index < len && curLen + 1 + words[index].length() <= maxWidth) {
                curLen = curLen + 1 + words[index].length();
                list.add(words[index]);
                index++;
            }

            //当前行为最后一行,特殊处理左对齐
            if (index == len) {
                StringBuilder sb = new StringBuilder(list.get(0));
                for (int k = 1; k < list.size(); k++) {
                    sb.append(" ").append(list.get(k));
                }
                while (sb.length() < maxWidth)
                    sb.append(" ");

                res.add(sb.toString());
                break;
            }

            //如果当前行只有一个 word,特殊处理为左对齐
            int count = list.size();
            if (count == 1) {
                String str = list.get(0);
                while (str.length() != maxWidth) 
                    str += " ";

                res.add(str);
                continue;
            }

            /**
            * 其余为一般情况
            * wordWidth : 当前行单词总长度;  =  单词+空格总长度 - 空格长度
            * spaceWidth : 当前行空格总长度;
            * spaceItemWidth  : 往下取整后的单位空格长度
            */
            int wordWidth = curLen - (count - 1);
            int spaceWidth = maxWidth - wordWidth;
            int spaceItemWidth  = spaceWidth / (count - 1);
            String spaceItem = "";

            for (int k = 0; k < spaceItemWidth; k++) {
                spaceItem += " ";
            }

            StringBuilder sb = new StringBuilder();
            for (int k = 0, sum = 0; k < count; k++) {
                String item = list.get(k);
                sb.append(item);
                if (k == count - 1)
                    break;
                sb.append(spaceItem);
                sum += spaceItemWidth;

                // 剩余的间隙数量(可填入空格的次数)
                int remain = count - k - 1 - 1;

                // 剩余间隙数量 * 最小单位空格长度 + 当前空格长度 < 单词总长度,则在当前间隙多补充一个空格
                if (remain * spaceItemWidth + sum < spaceWidth) {
                    sb.append(" ");
                    sum++;
                }
            }

            res.add(sb.toString());
        }
        return res;
    }
}

以上是关于Leetcode——文本左右对齐的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode 68.文本左右对齐

Leetcode——文本左右对齐

Leetcode No.68 文本左右对齐(模拟)

Leetcode No.68 文本左右对齐(模拟)

LeetCode 68. 文本左右对齐 / 1894. 找到需要补充粉笔的学生编号 / 600. 不含连续1的非负整数(数位dp,好好学)

bootstrap怎么文本左右对齐?