暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

每日一题——文本左右对齐

有理想的菜鸡 2020-06-14
129

菜鸡每日一题系列打卡68

每天一道算法题目 

小伙伴们一起留言打卡

坚持就是胜利,我们一起努力!


题目描述(引自LeetCode)

给定一个单词数组和一个长度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 "
        ]
        复制


        题目分析

        这是一道关于字符串的特殊规则的题目,像这种问题,根据规则进行模拟总不会出错的,只需要注意不同规则下的处理即可。话不多说,上代码!


        代码实现

          class Solution {


          public List<String> fullJustify(String[] words, int maxWidth) {
          List<String> result = new ArrayList<>();
          int flag = 0, count = 0, length = 0, start = 0;
          while (flag < words.length) {
          count += words[flag].length();
          if (count <= maxWidth) {
          flag++;
          length++;
          count++;
          } else {
          result.add(row(words, start, length, maxWidth));
          length = 0;
          count = 0;
          start = flag;
          }
          }
          result.add(lastRow(words, start, length, maxWidth));
          return result;
          }


          非最后一行的处理
          private String row(String[] words, int start, int length, int maxWidth) {
          for (int i = 0; i < length; i++) maxWidth -= words[start + i].length();
          StringBuilder builder = new StringBuilder();
          for (int i = 0; i < length; i++) {
          int step = length - i - 1;
          int flag = maxWidth;
          if (step > 0 && maxWidth % step == 0) flag = maxWidth step;
          else if (step > 0) flag = maxWidth step + 1;
          maxWidth -= flag;
          builder.append(words[start + i]);
          while (flag-- > 0) builder.append(' ');
          }
          return builder.toString();
          }


          // 最后一行的处理
          private String lastRow(String[] words, int start, int length, int maxWidth) {
          for (int i = 0; i < length; i++) maxWidth -= (words[start + i].length() + 1);
          length = maxWidth >= 0 ? length : length - 1;
          StringBuilder builder = new StringBuilder();
          for (int i = 0; i < length; i++) builder.append(words[start + i]).append(' ');
          if (maxWidth >= 0) while (maxWidth-- > 0) builder.append(' ');
          else builder.append(words[start + length]);
          return builder.toString();
          }


          }
          复制


          代码分析

          对代码进行分析,时间复杂度为O(n),空间复杂度为O(n)。


          执行结果



          学习 | 工作 | 分享

          👆长按关注“有理想的菜鸡

          只有你想不到,没有你学不到
          文章转载自有理想的菜鸡,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

          评论