X

LEETCODE 1324. Print Words Vertically 解题思路分析

题目大意:

竖直打印单词

给你一个字符串 s。请你按照单词在 s 中的出现顺序将它们全部竖直返回。
单词应该以字符串列表的形式返回,必要时用空格补位,但输出尾部的空格需要删除(不允许尾随空格)。
每个单词只能放在一列上,每一列中也只能有一个单词。

示例 1:

输入:s = "HOW ARE YOU"
输出:["HAY","ORO","WEU"]
解释:每个单词都应该竖直打印。 
  "HAY"
  "ORO"
  "WEU"

示例 2:

输入:s = "TO BE OR NOT TO BE"
输出:["TBONTB","OEROOE","   T"]
解释:题目允许使用空格补位,但不允许输出末尾出现空格。
 "TBONTB"
 "OEROOE"
 "   T"

示例 3:

输入:s = "CONTEST IS COMING"
输出:["CIC","OSO","N M","T I","E N","S G","T"]

提示:

  • 1 <= s.length <= 200
  • s 仅含大写英文字母。
  • 题目数据保证两个单词之间只有一个空格。

如果想查看本题目是哪家公司的面试题,请参考以下免费链接: https://leetcode.jp/problemdetail.php?id=1324

解题思路分析:

本题可以将n个字符串看作是一个矩阵,矩阵的每一列即是一个返回结果。比如:

// AB CDE F
AB
CDE
F

如果竖向看上面三个单词,很容易得出答案:[“ACF”, “BD”,” E” ]。这里唯一一个难点在于空格的输出,位于字符串前段和中段的空格是必须的,而位于尾部的是不需要输出的部分。写代码时,我们定义2个变量,一个代表总的单词个数allStringCount,一个代表当前列遍历过的单词数量count,还是使用上面的例子来说明,初始时一共含有3个单词(AB,CDE和F),对于第一列,先取AB的A,此时count加一,再取CDE的C,count再加一。最后取F的F,由于单词F的所有字符已经全部取完,因此 allStringCount 减一。此时 count 等于2, allStringCount也等于2,结束当前循环,将ACF加入返回结果,进入第二列,count 还原为0,首先从AB中取B,由于AB的所有字符已经取完,allStringCount 减一,继续取CDE的D,count加一,此时count与 allStringCount 均等于1,退出当前循环,将BD加入返回结果,进入第三列,count 还原为0 。此时AB已经取完,只能取空格字符” “,count不变。接下来从CDE中取E,由于CDE中所有字符已经取完, allStringCount 减一, allStringCount 与 count 均为0, 结束当前循环,将” E”存入返回结果。

实现代码:

public List<String> printVertically(String s) {
    // 将字符串以空格分隔
    String[] arr = s.split(" ");
    // 返回结果
    List<String> res = new ArrayList<>();
    // 总的单词数量
    int allStringCount = arr.length;
    // 当前列
    int col=0;
    // 循环每一列
    while(allStringCount>0){
        // 当前列遍历到的合理单词
        int count=0;
        // 当前列组成的字符串
        StringBuilder sb = new StringBuilder();
        // 循环当前列的每一行(每一个单词)
        for(String ss : arr){
            // 如果当前列大于单词长度
            if(col>=ss.length()){
                // 添加一个空格
                sb.append(" ");
            } else {
                // 将当前字符添加到列字符串中
                sb.append(ss.charAt(col));
                // 如果当前列是字符串最后一位,说明当前字符串已经使用完
                // allStringCount减一
                if(col==ss.length()-1) allStringCount--;
                // 反之,count加一
                else count++;
            }
            // 如果当前列已使用的单词数量等于总的单词数
            // 说明当前列不再包含其他单词,结束当前列
            if(count==allStringCount) break;
        }
        // 将当前列组成的单词加入返回结果
        res.add(sb.toString());
        col++; // 列加一
    }
    return res;
}

本题解法执行时间为0ms。

Runtime: 0 ms, faster than 100.00% of Java online submissions for Print Words Vertically.

Memory Usage: 40.9 MB, less than 100.00% of Java online submissions for Print Words Vertically.

本网站文章均为原创内容,并可随意转载,但请标明本文链接
如有任何疑问可在文章底部留言。为了防止恶意评论,本博客现已开启留言审核功能。但是博主会在后台第一时间看到您的留言,并会在第一时间对您的留言进行回复!欢迎交流!
本文链接: http://leetcode.jp/leetcode-1324-print-words-vertically-解题思路分析/
Categories: leetcode
kwantong: