1. 力扣6-10题解析:从字符串转换到正则表达式匹配
作为一名刷过300+力扣题的老手,我依然记得当初被第6题"Z字形变换"卡住整整两天的经历。力扣6-10题这个区间就像新手村的第一个精英怪集合,表面看是简单的字符串和数学问题,实则暗藏许多算法思维的转折点。本文将带大家逐题拆解这五道经典题目,分享我的解题思路和优化技巧。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 第六题:Z字形变换的索引映射艺术
2.1 问题本质与暴力解法
题目要求将字符串按给定行数进行Z字形排列后按行读取。例如"PAYPALISHIRING"在3行时会形成如下布局:
code复制P A H N
A P L S I I G
Y I R
直接按行输出得到"PAHNAPLSIIGYIR"。
新手最容易想到的方法是模拟Z字形填充过程,创建一个二维数组来存储字符位置。这种方法时间复杂度O(n²),空间复杂度O(n²),当n较大时性能堪忧。
2.2 优化解法:数学规律发现
通过观察可以发现,字符在每行的分布存在固定间隔规律:
- 第一行和最后一行字符间隔为cycleLen = 2*numRows - 2
- 中间行会有两个交替的间隔:cycleLen - 2i 和 2i
基于这个规律,可以写出时间复杂度O(n),空间复杂度O(n)的优化解法:
python复制def convert(s: str, numRows: int) -> str:
if numRows == 1:
return s
res = []
cycleLen = 2 * numRows - 2
n = len(s)
for i in range(numRows):
j = 0
while j + i < n:
res.append(s[j + i])
if i != 0 and i != numRows - 1 and j + cycleLen - i < n:
res.append(s[j + cycleLen - i])
j += cycleLen
return ''.join(re
