📜  在 N 行中连接 Zig-Zag 字符串(1)

📅  最后修改于: 2023-12-03 15:07:44.706000             🧑  作者: Mango

在 N 行中连接 Zig-Zag 字符串

题目描述

给定一个字符串和一个正整数N,将该字符串以“Z字形”顺序打印,即第一行从左到右打印,第二行从右到左打印,第三行从左到右打印,以此类推,完成 N 行之后再返回到第一行,继续打印,直至字符串结束。

例如:输入字符串为 "LEETCODEISHIRING",N=3 时,输出的 Zig-Zag 排列如下所示:

L   C   I   R
E T O E S I I G
E   D   H   N
解题思路

我们可以根据题目描述按照 Zig-Zag 的顺序模拟字符串的拼接,我们可以使用一个长度为 N 的字符串数组,将每行的字符依次填入其中,最后将所有行拼接起来即可。

具体思路如下:

  • 生成一个长度为 N 的字符串数组,表示 N 行的字符串。
  • 遍历输入字符串 str,根据 Z 字形顺序,将字符依次填入字符串数组中。
  • 将所有字符串数组拼接起来,即可得到最终的字符串输出。

注意事项:

  1. 如果 N 为 1,则输出原字符串即可。
  2. 当行数 N 大于字符串长度 str 的情况下,输出的字符串数组中会有空字符串,需要特殊处理。
代码实现

Python 代码实现如下:

def convert(s: str, numRows: int) -> str:
    # 处理特殊情况
    if numRows == 1 or numRows >= len(s):
        return s
    # 初始化字符串数组
    rows = [""] * numRows
    # 初始行为 0,flag 为 -1,表示从上到下拼接字符串;行为 numRows-1,flag 为 1,表示从下到上拼接字符串。
    cur_row, flag = 0, -1
    for char in s:
        # 将当前字符拼接到对应的行中
        rows[cur_row] += char
        # 到达行首或行尾时,转变拼接方向
        if cur_row == 0 or cur_row == numRows - 1:
            flag = -flag
        cur_row += flag
    # 拼接所有字符串数组
    return "".join(rows)

时间复杂度分析:

  • 时间复杂度:O(N),其中 N 为字符串的长度。整个字符串只遍历一遍即可。
  • 空间复杂度:O(N),其中 N 为字符串的长度。我们使用了一个长度为 N 的数组存储每行的字符串。
总结

该题目使用“Z字形”顺序拼接字符串,需要注意行指针的变化和特殊情况的处理。代码实现较为简单,时间复杂度为 O(N)。