LeetCode解题笔记 17 —— 68. 文本左右对齐

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m940034240/article/details/89156867

题目

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

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

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

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

说明:

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

示例:

输入:
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                  "
]

解法

class Solution {
    public List<String> fullJustify(String[] words, int maxWidth) {
        List<String> rList = new ArrayList<>();
        List<String> list = new ArrayList<>();
        int count = 0;
        count =  words[0].length();
        list.add(words[0]);
        for(int i = 1; i < words.length; i++){
            if(count + words[i].length() + 1 <= maxWidth){ //判断剩余位置是否足够放一个空格以及下一个单词
                count =  count + words[i].length() + 1;
                list.add(" " + words[i]);
                continue;
            }
            //位置不足,生成一行字符串
            StringBuilder b = new StringBuilder();
            if(list.size() == 1){ //只有一个单词,在后方补足空格
                b.append(list.get(0));
                while(b.length() < maxWidth){
                    b.append(" ");
                }
            }else if(list.size() == 2){//只有两个空格,在中部补足空格
                b.append(list.get(0));
                while(b.length() + list.get(1).length() < maxWidth){
                    b.append(" ");
                }
                b.append(list.get(1));
            }else{
                int m = (maxWidth - count)/(list.size()-1);//每个单词间要补多少个空格
                int n = (maxWidth - count)%(list.size()-1);//前多少个单词间要额外补一个空格
                for(int j = 0; j < list.size() - 1; j++){
                    b.append(list.get(j));
                    for(int z = 0; z < m; z++){
                        b.append(" ");
                    }
                    if(j<n){
                        b.append(" ");
                    }
                }
                b.append(list.get(list.size()-1));
            }
            rList.add(b.toString());
            list.clear();
            count =  words[i].length();
            list.add(words[i]);
        }
        //生成最后一行
        StringBuilder b = new StringBuilder();
        for(int j = 0; j < list.size(); j++){
            b.append(list.get(j));
        }
        while(b.length()<maxWidth){
            b.append(" ");
        }
        rList.add(b.toString());
        return rList;
    }
    
}

猜你喜欢

转载自blog.csdn.net/m940034240/article/details/89156867
今日推荐