一、今日学习目标
-
掌握字符串反转的核心思路,能够用双指针法实现基础字符串反转(LeetCode 344 题)
-
理解分段反转逻辑,解决 "每 2k 个字符反转前 k 个" 的进阶问题(LeetCode 541 题)
-
学会字符替换技巧,完成数字字符到特定字符串的替换(卡码网 54 题)
-
明确库函数的适用场景,在 "手动实现" 与 "高效调用" 之间建立平衡
二、核心知识梳理
1. 字符串的本质特性
-
在 Python 中,字符串是不可变序列,修改字符串需先转换为列表(如
list(s)),操作后再转回字符串(''.join(list)) -
反转操作的核心是元素交换,双指针法是实现反转的高效方式(时间复杂度 O (n),空间复杂度 O (1),原地修改场景)
2. 双指针法原理
-
定义左指针
left(起始索引 0)和右指针right(起始索引len(s)-1) -
交换
left和right指向的元素,然后left右移、right左移,直到left >= right
3. 分段反转逻辑(541 题核心)
-
遍历字符串时,以
2k为步长划分区间 -
对每个区间:若长度 >=k,则反转前 k 个字符;若长度 < k,则反转全部剩余字符
-
关键:计算每个分段的反转边界(
start到min(start+k-1, len(s)-1))
4. 字符替换技巧
-
对于需替换字符的场景(如数字→"number"),推荐用列表构建结果(避免字符串拼接的 O (n²) 时间复杂度)
-
遍历原字符串,遇到目标字符则追加替换内容,否则直接追加原字符
三、实战解题
1、反转字符串
题目描述
文章讲解
Python代码
class Solution(object):
def reverseString(self, s):
"""
:type s: List[str]
:rtype: None Do not return anything, modify s in-place instead.
"""
i, j = 0, len(s)-1
while i < j:
s[i], s[j] = s[j], s[i]
i += 1
j -= 1
return s
调试过程
通过双指针从两端向中间逼近,每步交换一对字符,实现原地反转,无需额外空间。
2、反转字符串②
题目描述
文章讲解
Python代码
class Solution(object):
def reverseStr(self, s, k):
"""
:type s: str
:type k: int
:rtype: str
"""
i = 0
chars = list(s)
while i < len(chars):
chars[i:i+k] = chars[i:i+k][::-1]
i += 2*k
return ''.join(chars)
调试过程
以2k为步长遍历,每次确定当前分段的反转范围[start, end],用双指针完成局部反转,兼顾不同长度的剩余字符场景。
3、替换数字
题目描述
文章讲解
Python代码
class Solution(object):
def subsitute_numbers(self, s):
"""
:type s: str
:rtype: str
"""
count = sum(1 for char in s if char.isdigit())
expand_len = len(s) + (count * 5)
res = [''] * expand_len
new_index = expand_len - 1
old_index = len(s) - 1
while old_index >= 0:
if s[old_index].isdigit():
res[new_index-5:new_index+1] = "number"
new_index -= 6
else:
res[new_index] = s[old_index]
new_index -= 1
old_index -= 1
return "".join(res)
if __name__ == "__main__":
solution = Solution()
while True:
try:
s = input()
result = solution.subsitute_numbers(s)
print(result)
except EOFError:
break
调试过程
用列表res收集结果,遍历字符串时判断字符是否为数字,按需追加 "number" 或原字符,最后通过join高效拼接(时间复杂度 O (n))。
四、易错点总结
-
索引越界问题:在 541 题中,计算
end时需用min(start + k - 1, n-1),避免因剩余字符不足 k 导致的索引超出范围。 -
字符串不可变性误区:Python 中直接修改字符串元素(如
s[0] = 'a')会报错,需先转为列表处理。 -
步长计算错误:541 题的遍历步长是
2*k,而非k,否则会重复处理已反转的区间。 -
替换效率问题:若用字符串直接拼接(如
res += "number"),每次操作会创建新字符串,时间复杂度升至 O (n²),推荐用列表。 -
边界条件遗漏:处理空字符串(如 344 题输入为空列表)时,双指针循环不会执行,需确保代码无异常。
五、扩展思考
-
库函数的合理使用:Python 的
s[::-1]可一键反转字符串,但 344 题要求原地修改,此时需手动实现;实际开发中,若无需原地修改,库函数是更高效的选择。 -
反转的其他实现方式:递归法(空间复杂度 O (n),递归栈开销)、切片法(
s_list[start:end+1] = s_list[start:end+1][::-1]),但双指针法仍是最优解。

646

被折叠的 条评论
为什么被折叠?



