uacs2024

导航

leetcode680-验证回文串 II。方法有缺陷,还需要继续琢磨

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;
    }
};

 

posted on 2022-11-22 10:47  ᶜʸᵃⁿ  阅读(46)  评论(0编辑  收藏  举报