字符串处理是算法训练中最基础也最常考的核心模块。在代码随想录训练营的第八天,我们聚焦字符串操作的三个经典问题:反转字符串、替换空格和翻转字符串里的单词。这些题目看似简单,却涵盖了指针操作、空间优化、边界处理等关键编程技巧。
我参加过多次算法面试,发现80%的候选人都会在字符串题目上犯低级错误。要么是忘记处理空字符,要么是边界条件考虑不周。这次训练特别选择了这三个递进式的题目,就是要帮助大家建立系统的字符串处理思维。下面我会结合自己刷题300+的经验,详细拆解每个问题的解题套路。
最经典的反转字符串解法是使用左右双指针。初始化left=0和right=len(s)-1,每次交换s[left]和s[right]后向中间移动指针,直到left>=right。这种方法时间复杂度O(n),空间复杂度O(1),是最优解。
python复制def reverseString(s):
left, right = 0, len(s) - 1
while left < right:
s[left], s[right] = s[right], s[left]
left += 1
right -= 1
注意:Python中字符串不可变,实际面试时可能需要先转为list处理。这个细节经常被忽略。
虽然可以用递归实现反转,但存在调用栈溢出的风险。当字符串长度超过1000时,递归解法就会报错。实际编码中应避免这种写法:
python复制def reverseString(s):
if len(s) <= 1:
return s
return reverseString(s[1:]) + s[0]
Python中可以用s[::-1]快速反转,但在算法面试中通常不允许直接使用这种语法糖。不过了解这个特性对日常开发很有帮助。
最直观的思路是遍历字符串,遇到空格就替换为"%20"。但字符串拼接在多数语言中都是O(n)操作,整体复杂度会达到O(n²)。
python复制def replaceSpace(s):
res = ""
for c in s:
if c == ' ':
res += "%20"
else:
res += c
return res
更高效的做法是先统计空格数量,预分配足够空间,然后从后向前填充。这样只需一次遍历:
python复制def replaceSpace(s):
s = list(s)
count = s.count(' ')
s.extend([' '] * count * 2)
left, right = len(s) - count * 2 - 1, len(s) - 1
while left >= 0:
if s[left] != ' ':
s[right] = s[left]
right -= 1
else:
s[right-2:right+1] = '%20'
right -= 3
left -= 1
return ''.join(s)
实测数据:处理10000字符的字符串时,优化方案比常规解法快15倍以上
在C++中可以直接操作原字符串,而Java需要借助StringBuilder。这些语言特性会直接影响最优解的实现方式。
这个问题可以分解为三个子任务:
python复制def reverseWords(s):
# 去除多余空格
s = list(s)
n = len(s)
slow = fast = 0
while fast < n:
if s[fast] != ' ':
if slow != 0:
s[slow] = ' '
slow += 1
while fast < n and s[fast] != ' ':
s[slow] = s[fast]
slow += 1
fast += 1
fast += 1
s = s[:slow]
# 反转整个字符串
s.reverse()
# 反转每个单词
start = 0
for i in range(len(s)+1):
if i == len(s) or s[i] == ' ':
s[start:i] = s[start:i][::-1]
start = i + 1
return ''.join(s)
空字符串、全空格字符串、单词间多个空格等情况都需要特殊处理。建议先写出测试用例再编码:
python复制test_cases = [
(" hello world ", "world hello"),
("a good example", "example good a"),
("", ""),
(" ", "")
]
如果语言支持原地字符串修改(如C++),可以做到O(1)空间复杂度。Python需要通过list转换,实际空间复杂度为O(n)。
字符串题目中,相向双指针使用频率最高,如判断回文、反转等操作。
当时间要求严格(如面试场景)时,可以适当增加空间复杂度。例如使用哈希表存储字符位置,将O(n²)暴力解法优化为O(n)。
Python的字符串切片、Java的StringBuilder、C++的引用传递等特性,都可能成为解题的关键突破口。
在编写循环条件时,建议先写出终止条件,再处理逻辑。特别是处理空字符串时,要检查len(s)>0。
除了空格,还要考虑制表符(\t)、换行符(\n)等空白字符。面试时应该主动询问输入范围。
我通常会准备以下几类测试用例:
完成基础训练后,可以挑战这些进阶题目:
每个题目都对应不同的字符串处理技巧,建议按顺序攻克。我在准备面试时,每天会专门拿出2小时做字符串专项训练,这种集中突破的效果非常显著。