解题思路
- 建立一个字符列表,其中的元素表示各行包含的Z型字符
- 来回遍历这个列表,依次将字符串的下一个字符添加进当前遍历元素的末尾
- 连接这个列表的元素,返回结果
本人代码
class Solution:
def convert(self, s: str, numRows: int) -> str:
Z_list = ['' for _ in range(numRows)] # 每个元素表示该行的字符
it = iter(s)
i = 0
flag = True # 判断字符串是否遍历完
while flag:
if i == 0:
# 正向遍历
for i in range(numRows):
try:
char = next(it)
Z_list[i] += char
except StopIteration:
flag = False
break
elif i == len(Z_list) - 1:
# 逆向遍历,只需遍历除去第一行和最后一行的行,避免重复
for i in range(numRows-2, 0, -1):
try:
char = next(it)
Z_list[i] += char
except StopIteration:
flag = False
break
i -= 1 # 需要 i-1 来使 i == 0
Z_str = ''.join(Z_list)
return Z_str
复杂度分析
- 时间复杂度: O ( n ) O(n) O(n)
- 空间复杂度: O ( n ) O(n) O(n)
运行结果
官方代码(更简洁)
class Solution:
def convert(self, s: str, numRows: int) -> str:
if numRows == 1:
return s
Z_list = ['' for _ in range(numRows)] # 每个元素表示该行的字符
curRow = 0
goingDown = False
for char in s:
Z_list[curRow] += char
if (curRow == 0 or curRow == numRows - 1):
goingDown = not goingDown
curRow += 1 if goingDown else -1
Z_str = ''.join(Z_list)
return Z_str
运行结果