Longest Palindromic Substring

求最长回文子串:

回文串是指正着读和反过来读都一样的字符串。

方法:

1. 为了统一解题方法,避免字符串长度奇偶对解题方法的影响,加入了填充字符。若原来的字符串长度为n,则新的字符串长度为2n+1。

2. pos+p[pos] 表示的是目前所有回文子串中,向右达到的最远位置。

3. 先利用对称性,找到p[i]的最小值,然后再进行搜索。

4. 注意数组不要越界!!

class Solution {
public:
    string longestPalindrome(string s) {
        int pos=0;
        string sub=s;
        int maxpos=0;
        if(!s.size())
            return sub;
        vector<int> p(2*s.size()+1,1);
        vector<char> str;
        for(int i=0;i<2*s.size()+1;i++)
        {
            if(i%2==0)
                str.push_back('#');
            else
                str.push_back(s[i/2]);
        }
        cout<<"new size:"<endl;
        for(int i=1;i<2*s.size();i++)
        {
            if(ipos)
            {
                int j=2*pos-i;
                p[i]=min(p[j],p[pos]+pos-i);
            }
            while(i+p[i]<2*s.size()+1&&i-p[i]>=0)
            {
                if(str[i+p[i]]==str[i-p[i]])
                    p[i]++;
                else
                    break;
            }
            if(p[maxpos]<p[i])
                maxpos=i;
            if(p[pos]+posi)
                pos=i;
        }
        cout<endl;
        int begin=(maxpos-p[maxpos]+2)/2;
        cout<endl;
        for(int i=0;i<2*s.size()+1;i++)
            cout<' '<<endl;
        sub=s.substr(begin,p[maxpos]-1);
        return sub;
    }

 

你可能感兴趣的:(Longest Palindromic Substring)