LeetCode LCR 018. 验证回文串
题目描述
思路分析
解法一:双指针过滤(推荐)
核心思路:
- 使用左右指针从两端向中间收缩,跳过非字母数字字符。
- 对比时统一转成小写,若不相等直接返回 false。
- 指针相遇或交错则说明是回文。
复杂度分析:
- 时间复杂度:O(n),其中 n 表示字符串长度。
- 空间复杂度:O(1),其中仅使用常数额外空间。
class Solution {
public boolean isPalindrome(String s) {
int left = 0;
int right = s.length() - 1;
while (left < right) {
// 跳过左侧非字母数字字符
while (left < right && !Character.isLetterOrDigit(s.charAt(left))) {
left++;
}
// 跳过右侧非字母数字字符
while (left < right && !Character.isLetterOrDigit(s.charAt(right))) {
right--;
}
// 忽略大小写比较两端字符
char c1 = Character.toLowerCase(s.charAt(left));
char c2 = Character.toLowerCase(s.charAt(right));
if (c1 != c2) {
return false;
}
left++;
right--;
}
return true;
}
}
func isPalindrome(s string) bool {
left := 0
right := len(s) - 1
for left < right {
// 跳过左侧非字母数字字符
for left < right && !isAlphaNum(s[left]) {
left++
}
// 跳过右侧非字母数字字符
for left < right && !isAlphaNum(s[right]) {
right--
}
// 忽略大小写比较两端字符
c1 := toLower(s[left])
c2 := toLower(s[right])
if c1 != c2 {
return false
}
left++
right--
}
return true
}
func isAlphaNum(c byte) bool {
return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9')
}
func toLower(c byte) byte {
if c >= 'A' && c <= 'Z' {
return c - 'A' + 'a'
}
return c
}
相似题目
| 题目 | 难度 | 考察点 |
|---|---|---|
| 9. 回文数 | 简单 | 双指针/数值处理 |
| 234. 回文链表 | 简单 | 快慢指针 |
| 680. 验证回文串 II | 简单 | 双指针 |
| 409. 最长回文串 | 简单 | 计数贪心 |
| 647. 回文子串 | 中等 | 中心扩展 |
| 5. 最长回文子串 | 中等 | 中心扩展/DP |
本博客所有文章除特别声明外,均采用
CC BY-NC-SA 4.0
许可协议,转载请注明出处!