Z 字形变换
将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 “PAYPALISHIRING” 行数为 3 时,排列如下:
P A H N
A P L S I I G
Y I R
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:“PAHNAPLSIIGYIR”。
请你实现这个将字符串进行指定行数变换的函数:
string convert(string s, int numRows);
来源:力扣(LeetCode)
AC代码
class Solution:
def convert(self, s: str, numRows: int) -> str:
if numRows == 1:
return s
temp = ['' for i in range(numRows)]
length = len(s)
res = ''
for i in range(numRows):
if i == 0:
j = 0
while j * numRows - j < length:
res += s[j * numRows - j]
j += 2
elif i == numRows - 1:
j = 1
while j * numRows - j < length:
res += s[j * numRows - j]
j += 2
else:
j = 0
while (j * numRows - j - i < length) or (j * numRows - j + i < length):
if j * numRows - j - i > 0:
res += s[j * numRows - j - i]
if j * numRows - j + i < length:
res += s[j * numRows - j + i]
j += 2
return res
官方代码
直接模拟,二维矩阵存放
class Solution:
def convert(self, s: str, numRows: int) -> str:
n, r = len(s), numRows
if r == 1 or r >= n:
return s
t = r * 2 - 2
c = (n + t - 1) // t * (r - 1)
mat = [[''] * c for _ in range(r)]
x, y = 0, 0
for i, ch in enumerate(s):
mat[x][y] = ch
if i % t < r - 1:
x += 1 # 向下移动
else:
x -= 1
y += 1 # 向右上移动
return ''.join(ch for row in mat for ch in row if ch)
# 作者:LeetCode-Solution
将稀疏矩阵优化为列表
class Solution:
def convert(self, s: str, numRows: int) -> str:
r = numRows
if r == 1 or r >= len(s):
return s`在这里插入代码片`
mat = [[] for _ in range(r)]
t, x = r * 2 - 2, 0
for i, ch in enumerate(s):
mat[x].append(ch)
x += 1 if i % t < r - 1 else -1
return ''.join(chain(*mat))
# 作者:LeetCode-Solution
直接构造,和我们的类似
class Solution:
def convert(self, s: str, numRows: int) -> str:
r = numRows
if r == 1 or r >= len(s):
return s
mat = [[] for _ in range(r)]
t, x = r * 2 - 2, 0
for i, ch in enumerate(s):
mat[x].append(ch)
x += 1 if i % t < r - 1 else -1
return ''.join(chain(*mat))