题目
思路
如果是单纯的判断是否为回文,方法为从字符串的两端开始向里逐步比较两个字符是不是相同,如果相同,则继续向里移动指针比较里面,只要出现一对字符不同,则该字符串不是回文串
本题的要求为最多删除一个字符
如果在逐步比较的过程中,字符都相同,那没什么好说的,一个字符也不用删除,就是回文串
如果第一次发现不一样,则需要考虑删除其中一个:因为如果都不删除,则字符串肯定不是回文串,而根据题目要求不能删除超过一个,因此剩下的可能性就是:
- 删除左边字符
- 删除右边字符
然后继续比对剩余的字符
代码
public boolean validPalindrome(String s) {
int left = 0;
int right = s.length()-1;
while (left < right) {
if (s.charAt(left) != s.charAt(right)) {
break;
}
left++;
right--;
}
if (left >= right) {
return true;
}
// 分别尝试删除左边,删除右边
return isP(s,left+1,right) || isP(s,left,right-1);
}
private boolean isP(String s,int left,int right) {
while (left < right) {
if (s.charAt(left) != s.charAt(right)) {
return false;
}
left++;
right--;
}
return true;
}