按单词竖直打印字符串 —— 题解与代码实现

题目描述

给你一个字符串 s,字符串中包含若干单词(单词之间以空格分隔)。
请你将这些单词按照它们在字符串中的出现顺序竖直打印出来。

具体要求如下:

  • 竖直排列后的每列对应一个单词,每行对应单词的第 i 个字符;
  • 如果某个单词长度不足,则用空格补齐;
  • 输出的每一行尾部不能有多余的空格(即不允许尾随空格);
  • 返回的结果是一个字符串列表,每个字符串代表一行竖直排列后的内容。

例如,对于输入:

s = "HOW ARE YOU"

预期输出是:

[
  "HAY",
  "ORO",
  "WEU"
]

其中,第一列是单词 "HOW" 的第 1、2、3 个字符,第二列是单词 "ARE" 的字符,第三列是单词 "YOU" 的字符。


解题分析

要实现该功能,关键在于如何正确地将单词按列对齐并竖直输出,且要注意:

  1. 确定竖直排列的总行数
    因为不同单词长度不一样,最长单词决定了最终竖排字符串的行数。
  2. 按行构造每一行字符串
    对于每一行 i,从每个单词取第 i 个字符,如果该单词长度不足,则用空格补位。
  3. 去除每行末尾的多余空格
    题目要求输出字符串不含尾部空格,必须使用字符串的 .rstrip() 函数去除。

解题方法及代码实现

我们用 Python 实现这一过程。步骤如下:

from typing import List

class Solution:
    def printVertically(self, s: str) -> List[str]:
        # 1. 拆分字符串为单词列表
        words = s.split()
        
        # 2. 找到最长单词长度
        max_len = max(len(word) for word in words)
        
        res = []
        
        # 3. 按行遍历(0到max_len-1)
        for i in range(max_len):
            line_chars = []
            
            # 4. 取每个单词的第 i 个字符(不存在则补空格)
            for word in words:
                if i < len(word):
                    line_chars.append(word[i])
                else:
                    line_chars.append(' ')
            
            # 5. 拼接成字符串并去除尾部空格
            line = ''.join(line_chars).rstrip()
            res.append(line)
        
        return res

代码分析与比较

  • 时间复杂度
    假设有 n 个单词,最长单词长度为 m,整体时间复杂度是 O(n * m),因为要遍历所有单词的每个字符位置。
  • 空间复杂度
    结果数组存储约 m 行,每行最多 n 个字符,空间复杂度 O(n * m)
  • 优点
    代码简洁明了,逻辑直观,利用字符串的 .rstrip() 高效去尾部空格。
  • 可优化点
    目前代码每行会先补足所有空格,最后再去尾部空格,实际对性能影响微乎其微。

相比其他可能使用复杂结构的方法(例如矩阵填充后逐行截取),这种方案更简洁且容易理解。


示例说明

示例 1

输入:

s = "HOW ARE YOU"
  • 单词列表:["HOW", "ARE", "YOU"]
  • 最长单词长度:3

按行处理:

行号(i)

取单词第 i 个字符

拼接结果(未去尾空格)

去尾空格后结果

0

"H" "A" "Y"

"HAY"

"HAY"

1

"O" "R" "O"

"ORO"

"ORO"

2

"W" "E" "U"

"WEU"

"WEU"

返回:

["HAY", "ORO", "WEU"]

示例 2

输入:

s = "TO BE OR NOT TO BE"
  • 单词列表:["TO", "BE", "OR", "NOT", "TO", "BE"]
  • 最长单词长度:3("NOT" 长度最大)

按行处理:

行号(i)

取单词第 i 个字符

拼接结果(未去尾空格)

去尾空格后结果

0

T B O N T B

"TBONTB"

"TBONTB"

1

O E R O O E

"OEROOE"

"OEROOE"

2

(空) (空) T

" T "

" T"

返回:

[
  "TBONTB",
  "OEROOE",
  "  T"
]

总结

  • 本题的核心是确定最长单词长度,然后按行遍历每个单词对应字符,补空格并去尾空格。
  • 用 Python 的字符串方法 .rstrip() 可以方便地处理尾部多余空格,满足题目要求。
  • 代码实现简洁,效率足够。
  • 这种竖直打印问题在面试和算法训练中较常见,掌握此类技巧对字符处理很有帮助。
Logo

更多推荐