Description
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.
分析
题目的意思是:给定一个字符串,然后可以删除一个字符,使其变成回文子串。
- 这个题目是典型的递归判断的题目,当这两个子串中至少有一个是回文串时,就说明原始字符串删除一个字符之后就以成为回文串。设定left从前往后遍历,right从后往前遍历,如果s[left]!=s[right]则判断s的left+1~right或者left ~ right-1是否是回文子串就行了哈。
C++实现
class Solution {
public:
bool validPalindrome(string s) {
int left=0;
int right=s.length()-1;
while(left<right){
if(s[left]!=s[right]){
return isPalindrome(s,left+1,right)||isPalindrome(s,left,right-1);
}
left++;
right--;
}
return true;
}
bool isPalindrome(string s,int start,int end){
while(start<end){
if(s[start]!=s[end]){
return false;
}
start++;
end--;
}
return true;
}
};
Python实现
如果出现不相同的字符串,有两种删除情况,第一种删除left指针,然后判断s[left+1:right]是否是回文;第二种是删除right指针,然后判断s[left:right-1]是否是回文。
class Solution:
def isPalindrome(self,s,left,right):
while left<right:
if s[left]!=s[right]:
return False
else:
left+=1
right-=1
return True
def validPalindrome(self, s: str) -> bool:
n = len(s)
left = 0
right = n-1
while left<right:
if s[left]!=s[right]:
leftflag=self.isPalindrome(s,left+1,right)
rightflag=self.isPalindrome(s,left,right-1)
if leftflag or rightflag:
return True
else:
return False
else:
left+=1
right-=1
return True