竖直打印单词

标签: 数组 字符串 模拟

难度: Medium

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

Submission

运行时间: 20 ms

内存: 15.9 MB

class Solution:
    def printVertically(self, s: str) -> List[str]:
        words = s.split(" ")
        maxlen = max(map(len, 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

Explain

题解的核心思想是先将输入字符串s按空格分割成单词列表,然后找出最长单词的长度。这一长度决定了输出列表中字符串的数量,即最终结果的高度。接着,对于每一个可能的字符位置(从0开始,直到最长单词的长度),从每个单词中尝试取出对应位置的字符,若当前单词长度不足,则用空格代替。这样,我们可以构建出每一列的字符串。由于输出不允许有尾随空格,因此每构建完一列后,需要对其进行右侧空格的剪裁。

时间复杂度: O(n + m*k)

空间复杂度: O(m*k)

class Solution:
    def printVertically(self, s: str) -> List[str]:
        words = s.split(" ")  # 将字符串s按空格分割成单词列表
        maxlen = max(map(len, 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  # 返回最终结果

Explore

列表推导式和条件表达式的使用提供了一种简洁且高效的方式来构建列表,特别是在需要从多个源(这里是不同单词)按条件(对应位置的字符存在与否)提取元素的场景中。使用列表推导式,可以直接在一个表达式中完成迭代、条件判断和列表生成,这样的代码不仅简洁,而且易于理解和维护。相比之下,使用传统的循环和条件结构可能会使代码更加冗长和复杂。

在构建每一列的字符串完成后,可以通过字符串的 `rstrip()` 方法来移除尾部的空格。这个方法会检查字符串尾部的连续空格,并将它们从字符串中删除,直到遇到一个非空格字符为止。这种方法不需要预先知道尾随空格的具体数量,因为 `rstrip()` 会自动处理这些空格。

在构建列字符串的过程中,每次迭代都是独立处理每个单词对应位置的字符。如果单词长度足够,则取出该位置的字符;如果不足,则添加空格。这样,每一次迭代都独立生成一列字符串,并且每个单词的贡献是独立的,互不影响。在整个过程中,由于不同列的字符串是在不同的迭代中生成的,因此列与列之间自然是隔离的。

每一列字符串生成后,使用字符串的 `rstrip()` 方法来剪裁掉右侧的空格。这个方法确保了每一列的输出都不会包含不必要的尾随空格,从而满足题目的要求。这种处理方式是自动的,并且效率高,因为它避免了额外的空格计数或迭代。