【双指针】680. 验证回文字符串 Ⅱ
题目
思路
l另外写一个判断回文字符串的函数,使用双指针进行循环,如果当前首尾指针指向的字符不相等,那么将他们其中之一删除,然后调用判断回文字符串的函数。这其中用到的原理就是一个回文字符串他的子串也是回文字符串
代码
class Solution {
public:
bool validPalindrome(string s) {
// 双指针
int l = 0;
int r = s.length() - 1;
while(l < r)
{
// 如果不相等
// 删除一个字符 之后 判断是否是回文字符串
// 利用的原理:回文串的子串也一定是回文串 如果子串不是 判定
// 也就是说l r 从两端向中间逼近
// 比如 aabcaa 一开始 首尾指针指向的a 确实相等 但是之后b 与 c 不相等 之后l指向c r也指向c 判定表该子串是回文字符串
// aacdehcaa l指向e r指向h l与r之间的子字符串不构成回文字符串
if(s[l] != s[r])
{
// 删除左指针指向的字符 或者右指针指向的字符
return isPali(s,l + 1,r) || isPali(s,l,r - 1);// 转为删除一个字符之后是否是回文字符串
}
l++;
r--;
}
// 如果执行到这里 说明该字符串本身就是回文字符串 不需要删除任何字符
return true;
}
// 判断是否是回文字符串
bool isPali(string s,int l,int r)
{
while(l < r)
{
if(s[l] != s[r])
{
return false;
}
l++;
r--;
}
return true;// 如果是回文字符串 两个指针重合或者相邻
}
};