题目:
给定一个非空字符串 s,最多删除一个字符。判断是否能成为回文字符串。
示例 1:
输入: "aba"
输出: True
示例 2:
输入: "abca"
输出: True
解释: 你可以删除c字符。
注意:
字符串只包含从 a-z 的小写字母。字符串的最大长度是50000
思路:验证是否是回文字符串很简单,但是题目中要求是如果删除一个字符后,依然能够成为回文字符串,返回true.
我们的思路是:
准备二个指针一个从头,一个从尾,同时运动,当遇到不同字符,这时可分为二种情况,我们假设不同的位置为i,j
- 删除i,剩下的只有[i+1,j]
- 删除j,剩下的只有[i,j-1]
顺便贴一个大佬的动图地址理解理解,地址:https://github.com/CyC2018/CS-Notes/blob/master/notes/Leetcode%20%E9%A2%98%E8%A7%A3%20-%20%E5%8F%8C%E6%8C%87%E9%92%88.md
public boolean validPalindrome(String s) {
//找到不相同的字符,删除它,再比较剩余的部分是否是回文字符串
int i=0,j=s.length()-1;
while(i<j){
if(s.charAt(i)!=s.charAt(j)){
//可删除i位置,也可删除j位置
return isPalindrome(s,i+1,j)||isPalindrome(s,i,j-1);
}
i++;
j--;
}
return true;
}
//判断是否是回文字符串
public boolean isPalindrome(String s,int i,int j){
while(i<j){
if(s.charAt(i)!=s.charAt(j)){
return false;
}
i++;
j--;
}
return true;
}