核心思路
最多删除一个,那单数删掉最中间的字母,双数删掉中间两个字母,看剩下的是否回文即可
python实现
class Solution:
def palindrome(self , str: str) -> bool:
l = len(str)
if l%2==0:
s = str[0:(l//2)-1] + str[(l//2)+1:] #总长度为偶数,删掉中间两个字母
else:
s = str[0:(l//2)] + str[(l//2)+1:] # 总长度为奇数,删掉中间一个字母
if s[0:len(s)//2] == s[len(s)//2:][::-1]:
return True
else:
return False
c++实现
class Solution {
public:
bool palindrome(string str) {
// write code here
int size1 = str.size();
string new_str;
if(size1 % 2){
new_str = str.substr(0, (size1/2)) + str.substr((size1/2)+1, (size1/2)); //单数去掉中间的一个
}else{
new_str = str.substr(0, (size1/2)-1) + str.substr((size1/2)+1, size1/2); //双数去掉中间的两个
}
string s2 = new_str.substr(new_str.size()/2, new_str.size()/2);
reverse(s2.begin(), s2.end());
if(new_str.substr(0, new_str.size()/2) == s2){
return true;
}else{
return false;
}
}
};
双指针也可以,思路差不多,算出来两边的起止位置,一个从头开始,一个从尾开始,循环判断即可