最长回文子串---Manacher算法

来源:互联网 发布:米兰达·可儿身材知乎 编辑:程序博客网 时间:2024/06/15 16:37

其实我根本不知道我写的对不对,因为我这个在Leetcode上跑的时间好像比较慢....

学习资料转自此处。

下面是自己写的代码(丑到死)

string longestPalindrome(string s){    int rad[2005];    for(int i = 0 ; i < 2005 ; i++) rad[i] = 0;    string str;    str.clear();    str.push_back('#');    for(int i = 0 ; i < s.size() ; i++){        str.push_back(s.at(i));        str.push_back('#');    }    rad[1] = 1;    int MaxRight = 2;    int pos = 1;    for(int i = 2 ; i < str.size() ; i++){        //cout << str.at(i) << endl;        if(i >= MaxRight){            int j = 1;            int temp = str.size() - i - 1;            for( ; j <= min(temp , i) ; j++){                if(str.at(i+j) != str.at(i-j)){                    j--;                    break;                }            }            j = min(min(temp , i) , j);     //这里最后J的值有点问题。如果加到边界会多一。            MaxRight = i + j;            rad[i] = j;            pos = i;            if(MaxRight == str.size() - 1) break;            //cout << "randge = " << min(temp , i) << endl;            //cout << "j = " << j << endl;        }        else{            int ki = pos - (i - pos);            int LM = pos - (MaxRight - pos);            int j = min(ki - LM , rad[ki]) + 1;            int temp = str.size() - i - 1;            for( ; j < min(temp , i) ; j++){                if(str.at(i+j) != str.at(i-j)){                    j--;                    break;                }            }            if(i+j > MaxRight){                MaxRight = i+j;                pos = i;            }            rad[i] = j;            if(MaxRight == str.size() - 1) break;        }    }    int max_rad = -1;    for(int i = 0 ; i < str.size() ; i++){        if(rad[i] > max_rad){            max_rad = rad[i];            pos = i;        }    }//debug:    /*cout << "rad : \n";    for(int i = 0 ; i < str.size() ; i++){        cout << str.at(i) << " ";    }    cout << endl;    for(int i = 0 ; i < str.size() ; i++){        cout << rad[i] << " ";    }    cout << endl;*///debug    if(str.at(pos) != '#') pos = (pos + 1) / 2 - 1 - (max_rad - 1) / 2;    else pos =  pos / 2 - 1 - (max_rad - 2) / 2;    str = s.substr(pos , max_rad);    return str;}