验证回文字符串
给定一个非空字符串 s,最多删除一个字符。判断是否能成为回文字符串。
示例:
aba true
abca true
abcda false
思路:
使用双指针,一个指针start从前往后遍历,一个指针end从后往前遍历,如果不一样,start+1或者end-1,判断两个字字符串是否为回文字符串,如果有一个是,返回true;
代码及注释:
C++:
calss Solution{
//判断一个字符串是否为回文字符串
//param s 源字符串
//param start 待判别字符串起始位置
//param end 待判别字符串结束位置
//return
bool checkPalindrome(const string &s,int start,int end){
//当start == end ,指示同一位置,所以为<
while(start<end){
//如果对应位置上的字符不同,return false
if(s[start]!=s[end])
return false;
//前指针往后移,后指针往前移
++start;
--end;
}
//字符串遍历完成,返回true
return true;
}
bool isPalindrome(string s){
int low = 0;
int high = s.size()-1;
while(low<high){
//如果对应位置字符串相同,判断下一个位置
if(s[low] == s[high]){
++low;
--high;
}
//如果不相同,删除low或者high,判断[low+1,high]到[low,high-1];
else return checkPalindrome(low+1,high) || checkPalindrome(low,high-1);
}
return true;
}
}
Python3:
def isPalindrome(self,s:str)->bool:
# python中#代表注释
# 句末加:表示和以下为同一部分
def checkPalindrome(start,end):
while start<end:
if s[start]!=s[end]:
return False
else:
start += 1
end -= 1
return True
#空一行表示是两个部分
#变量必须在初始化时赋值
i,j = 0,len(s)-1
while i<j:
if s[i]==s[j]:
i += 1
j -= 1
else:
return checkPalindrome(i+1,j) or checkPalindrome(i,j-1)
return True;