Longest Palindromic Substring
来源:互联网 发布:在哪购买淘宝小号 编辑:程序博客网 时间:2024/05/21 14:01
Description:
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.
算法1:
动态规划。复杂度是 O(n^2)
f[i][j] 表示 字串[i---j]是否是一个回文。
f[i][j] = true, i = j
s[i] == s[j], j = i+1
(s[i] == s[j]) && f[i+1][j-1], j > i+1;
string longestPalindrome(string s) { const int n=s.size(); int start(0), max_len(1); bool f[n][n]; fill_n(&f[0][0], n*n, false); for(int i=n-1; i>=0; --i) { f[i][i] = true; for(int j=i+1; j<n; ++j) { f[i][j] = (s[i]==s[j] ? true:false) && (j-i < 2 || f[i+1][j-1]); if(f[i][j] && j-i+1 > max_len){ start = i; max_len = j-i+1; } } } return s.substr(start, max_len); }};
算法2:
枚举回文的中心,向两边扩展。。复杂度 O(N^2)
class Solution {public:// start from centerstring longestPalindrome(string s){ if(s.size() < 2) return s; string longest; string p; for(int i=0; i<s.size()-1; ++i){ //palindrome is odd p = expandFromCenter(s, i, i);if(p.size() > longest.size()) longest = p;//palindrome is even p = expandFromCenter(s, i, i+1);if(p.size() > longest.size()) longest = p; } return longest;}private:string expandFromCenter(string s, int c1, int c2){ int l(c1), r(c2); while(l >= 0 && r < s.size() && s[l] == s[r]){ -- l; ++ r; } return s.substr(l+1, r-l-1);}};
3. Manacher 算法, 复杂度 O(n)
参考 http://leetcode.com/2011/11/longest-palindromic-substring-part-ii.html
// Manacher algorithm// Transform S into T// For example, S = "abba", T = "^#a#b#b#a#$"// ^ and $ signs are sentinels appended to each string// to avoid bound checkingstring preProcess(string s){ int n = s.length(); if (n == 0) return "^$"; string ret = "^"; for (int i = 0; i < n; ++i) ret += "#" + s.substr(i, 1); ret += "#$"; return ret;}string longestPalindromeManacher(string s){ string T = preProcess(s); int n = T.length(); vector<int> p(n, 0); int C = 0, R = 0; for (int i = 1; i < n-1; ++i){ int i_mirror = 2*C-i;p[i] = (i < R) ? min(R-i, p[i_mirror]) : 0; // attempt to expand palindrome centered at iwhile(T[i + 1 + p[i]] == T[i - 1 - p[i]]) ++ p[i];// If palindrome centered at i expand past R,// adjust center based on expanded palindrome,if(p[i] + i > R){ C = i; R = i + p[i];} } // Find the maximum element in p int maxLen = 0; int centerIndex = 0; for (int i = 1; i < n-1; ++i){ if(p[i] > maxLen){ maxLen = p[i]; centerIndex = i;} } return s.substr((centerIndex - 1 - maxLen)/2 , maxLen);}
3 0
- LeetCode: Longest Palindromic Substring
- LeetCode Longest Palindromic Substring
- LeetCode: Longest Palindromic Substring
- [Leetcode] Longest Palindromic Substring
- Longest Palindromic substring
- [LeetCode] Longest Palindromic Substring
- LeetCode5:Longest Palindromic Substring
- Leetcode : Longest Palindromic Substring
- Longest Palindromic Substring
- Longest Palindromic Substring
- [LeetCode]Longest Palindromic Substring
- leetcode Longest Palindromic Substring
- Longest Palindromic Substring
- LeetCode-Longest Palindromic Substring
- Longest Palindromic Substring
- Longest Palindromic Substring
- [LeetCode] Longest Palindromic Substring
- Longest Palindromic Substring leetcode
- python 异或运算
- 水题 判断能否被4整除或者含 有4
- 设计模式大总结2-结构型模式
- <<Oracle数据库性能优化艺术(第五期)>> 第12周 10053事件
- <<Oracle数据库性能优化艺术(第五期)>> 第13周 性能视图和性能参数
- Longest Palindromic Substring
- 如何将TabHost置于屏幕的下方
- 对近2年来“互联网思维”、“物联网”、“云计算”、“大数据”,“小白用户”等时髦词汇的些思考
- VC检测内存泄露
- <<Oracle数据库性能优化艺术(第五期)>> 第14周 性能报告分析(AWR,ASH)
- Android 上传文件
- C++内存管理(一)
- 从eclipse中下载到手机的android程序总是旧的版本
- 中文分词工具Rwordseg