zoukankan      html  css  js  c++  java
  • 68. Text Justification一行单词 两端对齐

    [抄题]:

    Given an array of words and a width maxWidth, format the text such that each line has exactly maxWidth characters and is fully (left and right) justified.

    You should pack your words in a greedy approach; that is, pack as many words as you can in each line. Pad extra spaces ' ' when necessary so that each line has exactly maxWidth characters.

    Extra spaces between words should be distributed as evenly as possible. If the number of spaces on a line do not divide evenly between words, the empty slots on the left will be assigned more spaces than the slots on the right.

    For the last line of text, it should be left justified and no extra space is inserted between words.

    Note:

    • A word is defined as a character sequence consisting of non-space characters only.
    • Each word's length is guaranteed to be greater than 0 and not exceed maxWidth.
    • The input array words contains at least one word.

    Example 1:

    Input:
    words = ["This", "is", "an", "example", "of", "text", "justification."]
    maxWidth = 16
    Output:
    [
       "This    is    an",
       "example  of text",
       "justification.  "
    ]
    

    Example 2:

    Input:
    words = ["What","must","be","acknowledgment","shall","be"]
    maxWidth = 16
    Output:
    [
      "What   must   be",
      "acknowledgment  ",
      "shall be        "
    ]
    Explanation: Note that the last line is "shall be    " instead of "shall     be",
                 because the last line must be left-justified instead of fully-justified.
                 Note that the second line is also left-justified becase it contains only one word.
    

    Example 3:

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

     [暴力解法]:

    时间分析:

    空间分析:

     [优化后]:

    时间分析:

    空间分析:

    [奇葩输出条件]:

    [奇葩corner case]:

    粘贴的时候遵循【第一个单词】+【空格】+【下一个单词】,先用空格占位置 空格在前面,否则空格在后面,不能做到最后还是单词:

    ["This   is   an   ","example     of     ","text            ","justification.  "]
    ["This    is    an","example  of text","justification.  "]

    [思维问题]:

    没思路

    [英文数据结构或算法,为什么不用别的数据结构或算法]:

    [一句话思路]:

    每一行中,用w数单词,数空格:初始化空格、更新空格,贴空格:贴正常的空格、剩下的空格贴最后面

    [输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入):

    [画图]:

    [一刷]:

    1. 贴单词的时候,w_w结构,别忘了把最后一个单词贴上

    [二刷]:

    [三刷]:

    [四刷]:

    [五刷]:

      [五分钟肉眼debug的结果]:

    [总结]:

    写这么长,无非就是每一行空格、空格

    [复杂度]:Time complexity: O(n) Space complexity: O(n)

    [算法思想:递归/分治/贪心]:

    [关键模板化代码]:

    [其他解法]:

    [Follow Up]:

    [LC给出的题目变变变]:

     [代码风格] :

     [是否头一次写此类driver funcion的代码] :

    class Solution {
        public List<String> fullJustify(String[] words, int maxWidth) {
            //ini
            List<String> res = new ArrayList<>();
            
            //cc
            if (words == null || words.length == 0) return res;
            if (maxWidth == 0) res.add("");
            
            //for each line i, count w, ini space, update space, add normal space: w_w, rmn space
            for (int i = 0, w; i < words.length; i = w) {
                
                //count word
                int len = - 1;
                for (w = i; w < words.length && len + words[w].length() + 1 <= maxWidth; w++) {
                    len += words[w].length() + 1;
                }
                
                //ini space
                int normalSpace = 1;
                int extraSpace = 0;
                int gaps = w - i - 1;
                
                //update spae
                if (w != i + 1 && w != words.length) {
                    normalSpace = (maxWidth - len) / gaps + 1;
                    extraSpace = (maxWidth - len) % gaps;
                }
                
                //add normal space: w_w in one line
                StringBuilder sb = new StringBuilder(words[i]);
                //each word
                for (int j = i + 1; j < w; j++) {
                    for (int k = 0; k < normalSpace; k++) {
                        sb.append(' ');
                    }
                    if (extraSpace > 0) {
                        sb.append(' ');
                        extraSpace--;
                    }
                    //append the last
                    sb.append(words[j]);
                }
                
                //append rmn to the tail
                int rmnSpaces = maxWidth - sb.length();
                while (rmnSpaces > 0) {
                    sb.append(' ');
                    rmnSpaces--;
                }
                    
                res.add(sb.toString());
            }
            
            return res;
        }
    }
    View Code
  • 相关阅读:
    数据库反范式~认识三大范式
    王家林的“云计算分布式大数据Hadoop实战高手之路从零开始”的第五讲Hadoop图文训练课程:解决典型Hadoop分布式集群环境搭建问题
    linux网络编程之System V 信号量(三):基于生产者消费者模型实现先进先出的共享内存段
    html知识点总结
    [置顶] HTML5开源RPG游戏引擎lufylegendRPG 1.0.0发布
    通过Android trace文件分析死锁ANR
    黄金连分数 蓝桥杯
    vxworks 6.9.3.1
    poj 3468 A Simple Problem with Integers(线段树区区)
    关于Java序列化的一些高级用法
  • 原文地址:https://www.cnblogs.com/immiao0319/p/9089803.html
Copyright © 2011-2022 走看看