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.
第一次:
想法是當(dāng)?shù)谝淮斡龅讲煌瑒t比較左下一位是否與右當(dāng)前一致,一致則左+1;否則比較右+1位和左當(dāng)前;都不一致則返回false。
458 / 460 test cases passed.
失敗于"cuppucu" 這樣的例子,刪左刪右結(jié)果不同
class Solution {
public boolean validPalindrome(String s) {
boolean delete = false;
int len = s.length();
if(len <= 2 && len >= 0) return true;
for(int i =0, j = len-1;i<j;i++,j--){
if(s.charAt(i) != s.charAt(j)){
if(!delete){
delete = true;
if(s.charAt(i+1) == s.charAt(j)){
i++;
}else if(s.charAt(i) == s.charAt(j-1)){
j--;
}else return false;
}else{
return false;
}
}
}
return true;
}
}
第二次嘗試:
460 / 460 test cases passed.
Runtime: 349 ms
效率非常低下
class Solution {
public boolean validPalindrome(String s) {
boolean delete = false;
int len = s.length();
if(len <= 2 && len >= 0) return true;
for(int i =0, j = len-1;i<j;i++,j--){
if(s.charAt(i) != s.charAt(j)){
if(s.charAt(i+1) == s.charAt(j)){ //左刪一位可以的情況下,先嘗試這種辦法
int i2 = i+1, j2 = j;
while(i2 < j2){
if(s.charAt(i2) != s.charAt(j2)) break;
i2++;j2--;
if(i2>=j2) return true;
}
}else{//左刪不可以,或者左刪嘗試失敗時(shí) 嘗試右刪,右刪再失敗就失敗
j = j-1;
while(i < j){
if(s.charAt(i) != s.charAt(j)) return false;
i++;j--;
}
}
}
}
return true;
}
}
分享一下優(yōu)秀版:
所以這么簡單的道理,到底為什么自己想的那么復(fù)雜呢?
class Solution {
public boolean validPalindrome(String s) {
int l = -1, r = s.length();
while (++l < --r) {
if (s.charAt(l) != s.charAt(r)) return isPalindromic(s, l, r+1) || isPalindromic(s, l-1, r);//左刪or右刪
}
return true;
}
private boolean isPalindromic(String s, int l, int r) {
while (++l < --r) {
if (s.charAt(l) != s.charAt(r)) return false;
}
return true;
}
}