问题:
Given a non-empty string s
, you may delete at most one character. Judge whether you can make it a palindrome.
Example 1:
Input: "aba" Output: True
Example 2:
Input: "abca" Output: True Explanation: You could delete the character 'c'.
Note:
- The string will only contain lowercase characters a-z. The maximum length of the string is 50000.
解决:
① 用双指针,两段同时比较,若有不相同的则计数器加一,若计数器的值大于1,我们就可以认定该字符串不能满足题意。
class Solution { //38ms
public boolean validPalindrome(String s) {
int left = 0;
int right = s.length() - 1;
int count = 0;
boolean flag = false;//标识是否已删除
char[] schar = s.toCharArray();
while (left < right){
if (schar[left] == schar[right]){
left ++;
right --;
}else{
count ++;
if (count > 1) return false;
if (schar[left + 1] != schar[right] && schar[left] != schar[right - 1]){
return false;
}
if (schar[left + 1] == schar[right]){
if (right > left + 2 && schar[left + 2] != schar[right - 1]) flag = true;//删除
if (! flag){
left ++;
continue;
}
}
right --;
flag = false;
}
}
return true;
}
}
② 在discuss中看到的。
class Solution { //42ms
public boolean validPalindrome(String s) {
char[] schar = s.toCharArray();
return validPalindrome(schar, 0, schar.length - 1, 1);
}
private boolean validPalindrome(char[] schar, int i, int j, int cap) {
if(i < 0 || j < 0 || i >= schar.length || j >= schar.length) return false;
if(cap == -1) return false;
if(i >= j) return true;
while(i < j && schar[i] == schar[j]) {
i ++;
j --;
}
if(i >= j) return true;
return validPalindrome(schar, i + 1, j, cap - 1) || validPalindrome(schar, i, j - 1, cap - 1);
}
}