LeetCode LCR 019. 验证回文串 II
题目描述
思路分析
解法一:双指针 + 一次容错(推荐)
核心思路:
- 使用双指针从两端向中间移动。
- 第一次出现不匹配时,尝试跳过左边或右边一个字符继续判断。
- 只允许删除一次字符,因此只需检查两种情况。
复杂度分析:
- 时间复杂度:O(n),其中 n 表示字符串长度。
- 空间复杂度:O(1)。
// 双指针容错判断
class Solution {
public boolean validPalindrome(String s) {
int left = 0;
int right = s.length() - 1;
while (left < right) {
if (s.charAt(left) == s.charAt(right)) {
left++;
right--;
} else {
return isPalindrome(s, left + 1, right) || isPalindrome(s, left, right - 1);
}
}
return true;
}
private boolean isPalindrome(String s, int left, int right) {
while (left < right) {
if (s.charAt(left) != s.charAt(right)) {
return false;
}
left++;
right--;
}
return true;
}
}
// 双指针容错判断
func validPalindrome(s string) bool {
left, right := 0, len(s)-1
for left < right {
if s[left] == s[right] {
left++
right--
} else {
return isPalindrome(s, left+1, right) || isPalindrome(s, left, right-1)
}
}
return true
}
func isPalindrome(s string, left, right int) bool {
for left < right {
if s[left] != s[right] {
return false
}
left++
right--
}
return true
}
相似题目
| 题目 | 难度 | 考察点 |
|---|---|---|
| 125. 验证回文串 | 简单 | 双指针 |
| 131. 分割回文串 | 中等 | 回溯 |
| 132. 分割回文串 II | 困难 | DP |
| 214. 最短回文串 | 困难 | 字符串 |
| 647. 回文子串 | 中等 | 双指针 |
本博客所有文章除特别声明外,均采用
CC BY-NC-SA 4.0
许可协议,转载请注明出处!