跳至主要內容

1324. 竖直打印单词

ITCharge大约 2 分钟

1324. 竖直打印单词open in new window

  • 标签:数组、字符串、模拟
  • 难度:中等

题目链接

题目大意

描述:给定一个字符串 ss

要求:按照单词在 ss 中出现顺序将它们全部竖直返回。

说明

  • 单词应该以字符串列表的形式返回,必要时用空格补位,但输出尾部的空格需要删除(不允许尾随空格)。
  • 每个单词只能放在一列上,每一列中也只能有一个单词。
  • 1s.length2001 \le s.length \le 200
  • ss 仅含大写英文字母。
  • 题目数据保证两个单词之间只有一个空格。

示例

  • 示例 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"

解题思路

思路 1:模拟

  1. 将字符串 ss 按空格分割为单词数组 wordswords
  2. 计算出单词数组 wordswords 中单词的最大长度 maxlenmax\underline{}len
  3. 第一重循环遍历竖直单词的每个单词位置 ii,第二重循环遍历当前第 jj 个单词。
    1. 如果当前单词没有第 ii 个字符(当前单词的长度超过了单词位置 ii),则将空格插入到竖直单词中。
    2. 如果当前单词有第 ii 个字符,泽讲当前单词的第 ii 个字符插入到竖直单词中。
  4. 第二重循环遍历完,将竖直单词去除尾随空格,并加入到答案数组中。
  5. 第一重循环遍历完,则返回答案数组。

思路 1:代码

class Solution:
    def printVertically(self, s: str) -> List[str]:
        words = s.split(' ')
        max_len = 0
        for word in words:
            max_len = max(len(word), max_len)

        res = []
        for i in range(max_len):
            ans = ""
            for j in range(len(words)):
                if i + 1 > len(words[j]):
                    ans += ' '
                else:
                    ans += words[j][i]
            res.append(ans.rstrip())
        
        return res

思路 1:复杂度分析

  • 时间复杂度O(n×max(word))O(n \times max(|word|)),其中 nn 为字符串 ss 中的单词个数,max(word)max(|word|) 是最长的单词长度。。
  • 空间复杂度O(n×max(word))O(n \times max(|word|))