给定一个非空字符串 s,请判断如果 最多 从字符串中删除一个字符能否得到一个回文字符串。
示例 1:
输入: s = "aba"
输出: true
示例 2:
输入: s = "abca"
输出: true
解释: 可以删除 "c" 字符 或者 "b" 字符
示例 3:
输入: s = "abc"
输出: false
提示:
1 <= s.length <= 105
s 由小写英文字母组成
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/RQku0D
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路及方法
双指针法,从头尾开始比较,一直到指针相等结束循环。如果指针指向都相等,为回文串;当指针指向字符不相等时,为保证只能删除一个字符,但我们也不知道哪边的字符是多余的,所以删除两边的字符都尝试删除。
class Solution {
public boolean validPalindrome(String s) {
int start = 0, end = s.length() - 1;
while (start < end) {
if (s.charAt(start) != s.charAt(end)) {
// 删除左字符或右字符
return isValid(s, start + 1, end) || isValid(s, start, end - 1);
}
start++;
end--;
}
return true;
}
public boolean isValid(String s, int start, int end) {
while (start < end) {
if (s.charAt(start) != s.charAt(end)) return false;
start++;
end--;
}
return true;
}
}
结果如下:
![](https://img.haomeiwen.com/i6573960/6cf092c4e0d7c30f.png)
网友评论