Leetcode #5
October 16, 2019
学习了一下Manacher算法,简单来说就是从中心往外扩展,同时利用len数组,根据对称性,省去不必要的扫描,具体做法见https://www.cnblogs.com/mini-coconut/p/9074315.html
class Solution { public: string longestPalindrome(string s) { string manaStr = "$#"; for (int i = 0; i < s.size(); i++) //首先构造出新的字符串 { manaStr += s[i]; manaStr += '#'; } vector<int> len(manaStr.size(), 0); //用一个辅助数组来记录最大的回文串长度,注意这里记录的是新串的长度,原串的长度要减去1 int pos = 0, p = 0; int start = 0, maxLen = 0; for (int i = 1; i < manaStr.size(); i++) { len[i] = i < p ? min(len[2 * pos - i], p - i) : 1; while (i + len[i] < manaStr.size() && i - len[i] > 0 && manaStr[i + len[i]] == manaStr[i - len[i]]) //这里要注意数组越界的判断,源代码没有注意,release下没有报错 len[i]++; if (i + len[i] > p) //如果新计算的最右侧端点大于p,则更新pos和p { pos = i; p = i + len[i]; } if (len[i] - 1 > maxLen) { start = (i - len[i]) / 2; maxLen = len[i] - 1; } } return s.substr(start, maxLen); } };