[leetcode][string] Longest Palindromic Substring

来源:互联网 发布:关键词搜索软件 编辑:程序博客网 时间:2024/06/14 12:33

题目:

Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring.

Manacher算法(O(n))

class Solution {public:string longestPalindrome(string s) {if (s.size() <= 1) return s;string aux;aux.push_back('?');//s中不存在的字符,哨兵的作用for (int ii = 0; ii < s.size(); ++ii){aux.push_back(s[ii]);aux.push_back('#');//s中不存在的字符}aux.pop_back();aux.push_back('*');//s中不存在的字符,哨兵的作用vector<int> rad(aux.size());//rad[i]表示以aux[i]为轴的回文的半径int i = 1, j = 0;while (i < aux.size()){//得到以aux[i]为轴的回文的半径while (aux[i - 1 - j] == aux[i + 1 + j])++j;//j表示半径rad[i] = j;//得到以aux[i+k]为轴的半径(根据rad[i]和rad[i-k]),k的范围是1到jint k = 1;while (k <= j && rad[i] - k != rad[i - k]){rad[i + k] = min(rad[i - k], rad[i] - k);++k;}j = max(rad[i] - k, 0);//如果aux[i]-k == aux[i-k],rad[i+k]至少为rad[i]-k, 所以计算rad[i+k]的rad的时候探测rad[i]-k或更大即可;i += k;//继续计算i+k及以后的字符为轴的回文半径rad}int maxPos = 1;for (int i = 1; i < rad.size(); ++i){if (rad[i] > rad[maxPos] || rad[i] == rad[maxPos] && aux[maxPos] != '#') maxPos = i;}string res;for (int iii = maxPos - rad[maxPos]; iii <= maxPos + rad[maxPos]; ++iii){if (aux[iii] != '#')res.push_back(aux[iii]);}return res;}};


0 0