LeetCode5 求回文子串算法
串相关算法打比赛那段时间就没怎么接触。。。408的kmp算法更是背下来的。
串常见算法有KMP算法,后缀树组,ac自动机,字典树等等。。
本题是最快速地求出一个字符串当中的最长回文子串。
https://www.cnblogs.com/mini-coconut/p/9074315.html这篇博客讲的最清楚了感觉,马拉车算法,
有点类似每个点向左右拓延的n方算法。
直接附上这位老哥的代码叭
马拉车算法
string longestPalindrome(string s) { string manaStr = "$#"; for (int i=0;i<s.size();i++) //首先构造出新的字符串 { manaStr += s[i]; manaStr += '#'; } vector<int> rd(manaStr.size(), 0);//用一个辅助数组来记录最大的回文串长度,注意这里记录的是新串的长度,原串的长度要减去1 int pos = 0, mx = 0; int start = 0, maxLen = 0; for (int i = 1; i < manaStr.size(); i++) { rd[i] = i < mx ? min(rd[2 * pos - i], mx - i) : 1; while (i+rd[i]<manaStr.size() && i-rd[i]>0 && manaStr[i + rd[i]] == manaStr[i - rd[i]])//这里要注意数组越界的判断,源代码没有注意,release下没有报错 rd[i]++; if (i + rd[i] > mx) //如果新计算的最右侧端点大于mx,则更新pos和mx { pos = i; mx = i + rd[i]; } if (rd[i] - 1 > maxLen) { start = (i - rd[i]) / 2; maxLen = rd[i] - 1; } } return s.substr(start, maxLen); }