1324-竖直打印单词

Raphael Liu Lv10

给你一个字符串 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 仅含大写英文字母。
  • 题目数据保证两个单词之间只有一个空格。

方法一:模拟

我们只需要顺着题目的要求进行模拟即可:

  • 第一步:将字符串 s 进行分词。在 Python 中可以直接使用 split() 函数对字符串进行分词,而在 C++ 中没有相关的函数,但可以借助 std::stringstream 类,将字符串 s 作为输入流,从中依次读取单词;

  • 第二步:统计最长的单词长度。对于我们返回的字符串列表,它的长度等于最长的单词长度,其中每个元素的长度等于单词的数量;

  • 第三步:得到字符串列表中的每个元素。对于字符串列表中的第 i 个元素,它由所有单词的第 i 个字母组成。我们依次遍历所有的单词,若单词中有第 i 个字母,则将该字母加入元素的末尾;若没有第 i 个字母,则将空格加入元素的末尾;

  • 第四步:去除尾随空格。在 Python 中可以直接使用 rstrip() 函数去除尾随空格,而在 C++ 中没有相关的函数,可以使用循环将字符串末尾的空格依次弹出,或使用 string::find_last_not_of() 函数找到字符串最右侧的非空格字符,再使用 string::substr() 函数得到不包含尾随空格的字符串。

[sol1-C++]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Solution {
public:
vector<string> printVertically(string s) {
stringstream in(s);
vector<string> words;
string _word;
int maxlen = 0;
while (in >> _word) {
words.push_back(_word);
maxlen = max(maxlen, (int)_word.size());
}
vector<string> ans;
for (int i = 0; i < maxlen; ++i) {
string concat;
for (string& word: words) {
concat += (i < word.size() ? word[i] : ' ');
}
while (concat.back() == ' ') {
concat.pop_back();
}
ans.push_back(move(concat));
}
return ans;
}
};
[sol1-Python3]
1
2
3
4
5
6
7
8
9
10
class Solution:
def printVertically(self, s: str) -> List[str]:
words = s.split()
maxlen = max(len(word) for word in words)
ans = list()
for i in range(maxlen):
concat = "".join([word[i] if i < len(word) else " " for word in words])
ans.append(concat.rstrip())
return ans

[sol1-Python3-1Line]
1
2
3
class Solution:
def printVertically(self, s: str) -> List[str]:
return ["".join(x).rstrip() for x in itertools.zip_longest(*s.split(), fillvalue=" ")]

复杂度分析

  • 时间复杂度:O(N\max(|S|)),其中 N 是字符串 s 中的单词个数,\max(|S|) 是最长的单词长度。

  • 空间复杂度:O(N\max(|S|))。

 Comments
On this page
1324-竖直打印单词