与有效回文类似,还是从字符串两端开始逐步比较两个字符是否相同,如果相同则继续移动;如果不同则删除一个字符后判断剩余部分是否构成回文。
public boolean validPalindrome(String s) {
// 初始化两个指针,分别从字符串的开头和结尾向中间移动
int start = 0;
int end = s.length() - 1;
// 循环直到两指针相遇
for (; start < end; start++, end--) {
// 如果当前两指针指向的字符不相等
if (s.charAt(start) != s.charAt(end)) {
// 调用 isPalindrome 方法判断删除一个字符后剩余部分是否构成回文
// 不知道删除哪个字符合适,所以都要尝试
return isPalindrome(s, start, end - 1) || isPalindrome(s, start + 1, end);
}
}
return true;
}
// 判断给定字符串在指定范围内是否为回文
public boolean isPalindrome(String s, int start, int end) {
// 通过两个指针从范围的两端向中间移动,比较对应位置的字符是否相等
while (start < end) {
// 如果不相等,说明不是回文,返回 false
if (s.charAt(start) != s.charAt(end)) {
return false;
}
start++;
end--;
}
// 如果一直相等,则是回文,返回 true
return true;
}