题目大意:
竖直打印单词
给你一个字符串 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.
本网站文章均为原创内容,并可随意转载,但请标明本文链接如有任何疑问可在文章底部留言。为了防止恶意评论,本博客现已开启留言审核功能。但是博主会在后台第一时间看到您的留言,并会在第一时间对您的留言进行回复!欢迎交流!
本文链接: https://leetcode.jp/leetcode-1324-print-words-vertically-解题思路分析/