[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
- [leetcode][string] Longest Palindromic Substring
- LeetCode: Longest Palindromic Substring
- LeetCode Longest Palindromic Substring
- LeetCode: Longest Palindromic Substring
- [Leetcode] Longest Palindromic Substring
- [LeetCode] Longest Palindromic Substring
- Leetcode : Longest Palindromic Substring
- [LeetCode]Longest Palindromic Substring
- leetcode Longest Palindromic Substring
- LeetCode-Longest Palindromic Substring
- [LeetCode] Longest Palindromic Substring
- Longest Palindromic Substring leetcode
- LeetCode Longest Palindromic Substring
- LeetCode - Longest Palindromic Substring
- LeetCode -- Longest Palindromic Substring
- LeetCode | Longest Palindromic Substring
- LeetCode: Longest Palindromic Substring
- [LeetCode]Longest Palindromic Substring
- 工作总结 8.9-18
- 通过运算符重载实现复数运算
- boost bind 用法
- iGrimace IG1.44和V3.0.0 版本区别
- 比较全面的JS验证
- [leetcode][string] Longest Palindromic Substring
- CCF 201312-2ISBN号码
- IOS Frame 和 Bounds的区别(自己的理解以便以后使用)
- Android SDK Manager不能显示所有包的解决办法
- 欢迎使用CSDN-markdown编辑器
- OC中数组的四种遍历方式
- 线程初体验之跑马灯
- 二维数组操作
- 黑马程序员———C语言———【strlen()和sizeof()的区别、排序、算法】