题目
给定一个非空字符串 s,请判断如果 最多 从字符串中删除一个字符能否得到一个回文字符串。
示例 1:
输入: s = "aba"
输出: true
示例 2:
输入: s = "abca"
输出: true
解释: 可以删除 "c" 字符 或者 "b" 字符
示例 3:
输入: s = "abc"
输出: false
提示:
1 <= s.length <= 105
s 由小写英文字母组成
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/RQku0D
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题解
思路:参考剑指Offer || 018.有效的回文,双指针移动来逐个对比。设置一个flag,用来判断是否删除过元素。双指针移动到字符不相等的地方时,不知道应该跳左指针的字符还是右指针的,都试一下即结果。
小tips:注意传值l+1时不要使用++l或者l++,++l虽然是先++再传值,但是影响了后面judge(s,l,r+1)的l
代码:
class Solution {
public boolean validPalindrome(String s) {
int n = s.length();
int l = 0, r = n - 1,flag=1;
while (l < r) {
if(s.charAt(l)!=s.charAt(r)&&flag==0) {
return false;
}else if(s.charAt(l)!=s.charAt(r)&&flag==1) {
flag--;
if(judge(s,l+1,r)||judge(s,l,r-1)) return true;
else return false;
}
l++;
r--;
}
return true;
}
boolean judge(String s,int l,int r) {
while (l < r) {
if(s.charAt(l)!=s.charAt(r)) {
return false;
}
l++;
r--;
}
return true;
}
}
尝试过,是否可以加if来判断是删除左字符还是右字符,是错误的
class Solution {
public boolean validPalindrome(String s) {
int n = s.length();
int l = 0, r = n - 1,flag=1;
while (l < r) {
if(s.charAt(l)!=s.charAt(r)&&flag==0) {
return false;
}else if(s.charAt(l)!=s.charAt(r)&&flag==1) {
if(s.charAt(l+1)==s.charAt(r)) {
l++;
flag--;
}
else if(s.charAt(l)==s.charAt(r-1)) {
r--;
flag--;
}
else return false;
}
l++;
r--;
}
return true;
}
}
举例:s="cuppucu"时,对左指针先判断即true,右指针先判断即false。