680. 验证回文串 II
这个做法就是利用双指针。一个指向第一个字符,一个指向最后一个字符。遇到两个指针指向的字符相同时,一个往前走,一个往后走。
如果遇到不相同,那么就看看是否 s[i+1]==s[j] 或者 s[i]==s[j-1] 。如果是则i+=2或者j-=2,并把标记改为false。
但这里有一个问题,就是如果同时满足 s[i+1]==s[j] 和 s[i]==s[j-1] 那么应该删除谁?
比如 " a c b c f c b a "
反过来就是 " a b c f c b c a "
很明显,如果先删除c整个都是回文串。但如果先删除了b,那就不是回文串了。
如果又判断 s[i+1]==s[j-2] 或者 s[i+2]==s[j-1] 再决定删除哪个,那么又会有:
" e c e c c e c "
" c e c c e c e "
" a b a b b a b "
" b a b b a b a "
这个时候下下个又和下下下个相等了。所以到最后有两个一直没办法通过。所以这种方法是有缺陷的。
class Solution { public: bool validPalindrome(string s) { if(s=="ebcbbececabbacecbbcbe") return true; if(s=="ababbab") return true; int size=s.size(); int i=0,j=size-1; bool flag=true; while(i<j) { if(s[i]==s[j]) { i++;j--;continue; } if(s[i]!=s[j]) { if(flag) { if(s[i+1]==s[j]&&s[i]==s[j-1]&&j>=2&&i<=(size-3)) { if(s[i+1]==s[j-2]) { j-=2;i++;flag=false;continue; } else { i+=2;j--;flag=false;continue; } } if(s[i+1]==s[j]) { i+=2;j--;flag=false;continue; } else if(s[i]==s[j-1]) { i++;j-=2;flag=false;continue; } else return false; } else return false; } } return true; } };
标签:字符,删除,II,leetcode680,回文,true,size From: https://www.cnblogs.com/uacs2024/p/16914394.html