解题思路
最多删除一个字符使其成为回文串,首先根据回文串的特点,即两边互相对应。
因此判断的方法可以有两种:
- 翻转后两个字符串相同,是回文串
- 使用双指针进行判断
这里需要涉及删除,因此使用双指针,l和r,假设l不等于r,则l++,同时记录删除字符的个数cnt–,如果第二次遇到l不等于r,则不能成为一个回文串,反之则可以。
上面的分析存在漏洞,当l和r所处位置不能构成回文串时,有两种做法,一种是删除l位置的字符,则l++,另一种是删除r位置的字符则r–,当这两种做法至少有一个是回文串则能够继续进行。
java">class Solution {
public boolean validPalindrome(String s) {
// 获取长度
int len = s.length();
int left = 0, right = len - 1;
// 双指针
while(left < right){
// 取出字符串中的字符
char c1 = s.charAt(left), c2 = s.charAt(right);
// 判断
if (c1 == c2){
++left;
--right;
}
else {
// 不相等则递归
return validPalindrome(s, left, right-1) || validPalindrome(s, left+1, right);
}
}
return true;
}
public boolean validPalindrome(String s, int left, int right){
// 该函数只需要判断两种情况能否满足是回文串
for (int i = left, j = right; i < j; ++i, --j){
char c1 = s.charAt(i), c2 = s.charAt(j);
if (c1 != c2){
return false;
}
}
return true;
}
}