题解 | #最长回文子串#

最长回文子串

http://www.nowcoder.com/practice/b4525d1d84934cf280439aeecc36f4af

Manacher算法要会,O(n)的算法,根据回文串的子串特征减少不必要的比较和搜索,字符串这里的算法提出者真的让人佩服

class Solution {
public:
    string init(string A){
        string newA = "#";
        for(int i = 0; i < A.size(); i++){
            newA += A[i];
            newA += "#";
        }
        return newA;
    }
    int getLongestPalindrome(string A, int n) {
        // write code here
        string newA = init(A);
        int* p = new int[newA.size()];
        for(int i = 0 ; i < newA.size(); i++)
            p[i] = 1;
        p[0] = 1;
        int i = 1;
        while(i < newA.size()){
            int lo = i - p[i];
            int hi = i + p[i];
            while(lo >= 0 and hi < newA.size())
                if(newA[lo] == newA[hi]){
                    p[i]++;
                    lo--;
                    hi++;
                }else
                    break;
            
            int j = 1;
            for(j = 1; j < p[i] ; j++){
                int newi = j + i;
                if(newi >= newA.size())
                    break;
                int newi_symmetry = 2 * i - newi;
                // newi_symmetry一定在newA范围内
                if(newi_symmetry - p[newi_symmetry] == i - p[i] ){
                    // newi处于不可判断的状态
                    p[newi] = p[newi_symmetry];
                    
                    break;
                }
                else{
                    p[newi] = min(p[newi_symmetry], newi_symmetry - i + p[i]);
                }
            }
            i = j + i;
        }
        int ma = -1;
        for(i = 0 ; i < newA.size() ; i++){
            if(ma < p[i] - 1)
                ma = p[i] - 1;
        }
        return ma;
        
    }
};
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务