C\C++最长回文子串

这篇博客介绍了如何使用C/C++编写Manacher算法来找出字符串中最长的回文子串。通过预处理字符串和维护回文子串的边界及中心点,算法有效地避免了重复计算,提高了效率。最终返回最长回文子串的长度。
摘要由CSDN通过智能技术生成
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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值