
1) 【一句话结论】
可以用双指针法在原字符串上判断回文,通过过滤非字母数字字符并统一大小写,时间复杂度O(n),空间复杂度O(1),覆盖空字符串和单字符边界,是前端场景下高效且优化的方案。
2) 【原理/概念讲解】
首先明确回文定义:正读反读都相同的字符串(如“racecar”)。双指针法核心是从字符串两端向中间移动指针,逐个字符比较有效字符。具体步骤:
left(从首字符开始)、右指针right(从尾字符开始);left直到遇到字母/数字(过滤空格、标点),移动right直到遇到字母/数字;left和right位置的字符(忽略大小写,如'a'和'A'视为相同);3) 【对比与适用场景】
| 方法 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 双指针原位处理 | 从两端向中间比较有效字符,原位过滤非字母数字 | 时间O(n),空间O(1) | 前端性能敏感场景(如实时判断) | 需处理空格、大小写、非字母数字 |
| 反转字符串比较 | 新建字符串反转后与原字符串比较 | 时间O(n),空间O(n)(额外字符串) | 简单实现,字符串较短时 | 空间开销大 |
| 递归 | 递归比较首尾字符 | 时间O(n),空间O(n)(递归栈) | 理论展示 | 栈溢出风险高(长字符串不适用) |
4) 【示例】
输入字符串:"!A man, a plan, a canal: Panama"
处理过程:
"AmanaplanacanalPanama"True。def is_palindrome(s: str) -> bool:
left, right = 0, len(s) - 1
while left < right:
# 移动left到下一个有效字符
while left < right and not s[left].isalnum():
left += 1
# 移动right到上一个有效字符
while left < right and not s[right].isalnum():
right -= 1
# 比较字符(忽略大小写)
if s[left].lower() != s[right].lower():
return False
left += 1
right -= 1
return True
5) 【面试口播版答案】
“首先,判断回文的核心是检查字符串正反是否相同。这里用双指针法,一个从左端,一个从右端,逐步向中间移动,比较对应位置的字符。为了准确判断,需要忽略空格、标点,并统一大小写。比如字符串‘Race a car’,处理后为‘raceacar’,每个有效字符对称,所以是回文。时间复杂度O(n),空间O(1),通过原位过滤和比较,避免额外空间,适合前端场景。”
6) 【追问清单】
7) 【常见坑/雷区】