题目
题目描述
将一个给定字符串 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);
示例 1:
输入:s = “PAYPALISHIRING”, numRows = 3
输出:“PAHNAPLSIIGYIR”
示例 2:
输入:s = “PAYPALISHIRING”, numRows = 4
输出:“PINALSIGYAHRPI”
解释:
P I N
A L S I G
Y A H R
P I
示例 3:
输入:s = “A”, numRows = 1
输出:“A”
提示:
1 <= s.length <= 1000
s 由英文字母(小写和大写)、‘,’ 和 ‘.’ 组成
1 <= numRows <= 1000
题目链接
题解
要实现将字符串 s
根据给定的行数 numRows
进行 Z 字形排列,并返回重新排列后的字符串,可以按照以下步骤进行:
-
特殊情况处理:
- 如果
numRows
为 1 或者字符串长度小于等于numRows
,直接返回原字符串,因为不需要进行 Z 字形排列。
- 如果
-
构建 Z 字形排列:
- 创建一个列表
rows
,其中每个元素是一个字符串,用于存储每一行的字符。 - 遍历字符串
s
,根据当前字符的位置确定其所在的行,并将其添加到相应的行中。
- 创建一个列表
-
确定字符所在行:
- 使用一个变量
current_row
来记录当前字符所在的行。 - 使用一个变量
direction
来记录当前的方向(向上或向下)。 - 当到达第一行或最后一行时,改变方向。
- 使用一个变量
-
拼接结果:
- 将
rows
中的字符串按顺序拼接起来,得到最终的结果。
- 将
Python 实现
def convert(s: str, numRows: int) -> str:
if numRows == 1 or numRows >= len(s):
return s
# 初始化每一行的字符串
rows = [''] * numRows
current_row = 0
direction = -1 # -1 表示向下,1 表示向上
for char in s:
rows[current_row] += char
if current_row == 0 or current_row == numRows - 1:
direction = -direction # 改变方向
current_row += direction
# 拼接所有行
return ''.join(rows)
详细解释
-
特殊情况处理:
if numRows == 1 or numRows >= len(s): return s
:如果numRows
为 1 或者字符串长度小于等于numRows
,直接返回原字符串。
-
初始化每一行的字符串:
rows = [''] * numRows
:创建一个长度为numRows
的列表,每个元素是一个空字符串。current_row = 0
:初始化当前行号为 0。direction = -1
:初始化方向为 -1,表示向下移动。方向为 1 表示向上移动。
-
遍历字符串
s
:for char in s:
:遍历字符串s
中的每个字符。rows[current_row] += char
:将当前字符char
添加到当前行current_row
的字符串中。if current_row == 0 or current_row == numRows - 1: direction = -direction
:如果当前行是第一行或最后一行,改变方向。current_row += direction
:根据当前方向更新当前行号。
-
拼接结果:
return ''.join(rows)
:将rows
列表中的所有字符串按顺序拼接成一个完整的字符串,并返回。
通过上述步骤,我们可以有效地将字符串 s
按照给定的行数 numRows
进行 Z 字形排列,并返回重新排列后的字符串。