C\C++最长回文子串

来源:互联网 发布:淘宝首页怎么加载数据 编辑:程序博客网 时间:2024/06/11 22:12
string pre(string s){
string p;
for (int i = 0; i < s.length(); i++){
p.insert(p.end(), '#');
p.insert(p.end(), s[i]);
}
p.insert(p.end(), '#');
return p;
}


int Manacher(string s){
int *p = new int[s.length()];
for (int i = 0; i < s.length(); i++){ p[i] = 0; }
int mx=1;//最长回文子串的边界
int id = 1;//最长回文子串中心点的位置
for (int i = 1; i < s.length()-1; i++){
if (mx>i){
if ((mx - i)>p[2 * id - i]){ p[i] = p[2 * id - i]; }
else{ p[i] = mx - i; }
}
else{ p[i] = 1; }
while (i-p[i]>=0&&i+p[i]<=s.length()-1){//使用的是string 所以要防止越界
if (s[i + p[i]] == s[i - p[i]]){ p[i]++; }
else{ break; }
}
if (i + p[i] > mx){ mx = i + p[i]; id = i; }
}


int res = 0;
for (int i = 0; i < s.length(); i++){
if (p[i]>res){
res = p[i];
}
}
return res-1;
}
原创粉丝点击