题解
标志转向
-
特判,若行数 n u m R o w s < 2 numRows<2 numRows<2,返回 s s s
-
初试化 r e s = [ " " , ⋯ , " " ] res=["",\cdots,""] res=["",⋯,""],长度为 n u m R o w s numRows numRows, r e s [ i ] res[i] res[i]表示第 i i i行存放的字符。
-
初始化标志 f l a g = − 1 flag=-1 flag=−1,初试行 i = 0 i=0 i=0
-
遍历字符串中每一个字符 c c c:
- 若 i = = 0 o r i = = n u m R o w s − 1 i==0\ or\ i==numRows-1 i==0 or i==numRows−1,说明应该更换方向,向下为 1 1 1,向上为 − 1 -1 −1,因此 f l a g = − f l a g flag=-flag flag=−flag
- 将当前字符 c c c填入对应行 i i i。
- 更新行 i = i + f l a g i=i+flag i=i+flag
-
将 r e s res res中各行连接起来并返回。
复杂度分析
- 时间复杂度: O ( n ) O(n) O(n)
- 空间复杂度: O ( n ) O(n) O(n)
Python
class Solution:
def convert(self, s: str, numRows: int) -> str:
if(numRows<2):
return s
res=[""]*numRows
n=len(s)
flag=-1
i=0
for c in s:
res[i]+=c
if(i==0 or i==numRows-1):flag=-flag
i+=flag
return "".join(res)