class Solution { public: bool validPalindrome(string s) { int len = s.length(); if (len <= 2) return true; return judge(s, 0, len - 1, 1); } private: bool judge(string s, int l, int r, int cnt) { while (l <= r - 1) { if (s[l] != s[r]) { if (cnt <= 0) return false; return judge(s, l + 1, r, cnt - 1) || judge(s, l, r - 1, cnt - 1); } l++; r--; } return true; } };
参考网上的实现,递归解法。
主要思想是:双指针。
判断一个字符串是否是回文,基本的方法是使用双指针。一个从左向右遍历,一个从右向左遍历。
每次遍历进行判断,如果左和右不想等,那么就说明不是回文。
这道题是在判断回文的基础上,可以删除一个字符。
当左和右不想等的时候,有两种可能:左边的是多余字符,右边的是多余字符。
那么就尝试删除左边的或者尝试删除右边的,只要有一种情况能够满足回文,那就返回True。