竖直打印单词(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
仅含大写英文字母。
题目数据保证两个单词之间只有一个空格。
代码与思路
先求所有单词的最长的那个单词的长度,假设为maxLen;
列遍历[0, maxLen),然后遍历每个单词,取出每个单词对应列的字符,若当前的列超出单词的长度,则用空格替代;
其中,题目说了要去除尾随空格(注意,不能前后空格,不能直接trim),因此,每次处理完一列就处理一下尾随空格即可。
来自
// 删除尾随空格
private String removeSuffixSpaces(String str) {
StringBuilder sb = new StringBuilder();
boolean begin = false;
for (int i = str.length() - 1; i >= 0; i--) {
if (str.charAt(i) != ' ') {
begin = true;
}
if (begin) {
sb.append(str.charAt(i));
}
}
return sb.reverse().toString();
}
public List<String> printVertically(String s) {
String[] str = s.split(" ");
int wordLen = str.length;
int maxLen = 0;
for (String word : str) {
maxLen = Math.max(maxLen, word.length());
}
List<String> ansList = new ArrayList<>();
for (int j = 0; j < maxLen ;j++) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < wordLen; i++) {
if (str[i].length() <= j) {
sb.append(' ');
} else {
sb.append(str[i].charAt(j));
}
}
ansList.add(removeSuffixSpaces(sb.toString()));
}
return ansList;
}