标签:leetcode 最长回文子串 string 多种解法
很经典的题目,求字符串中的最长回文子串。
(1)最朴素的解法 ---暴力 复杂度O(N3)
这也是最容易想到的方法,最外层循环枚举起点i,第二层循环从i+1开始向后枚举,第三层判断是不是回文串。最后取最长子串的返回。
代码比较简单,这里没有列出。
(2)中心扩展法。复杂度O(N2)
枚举每一个字符作为中心点向左右扩展。但是这里要注意,对于每一次扩展要分奇偶两种情况。否则可能会漏掉情况。
一发现不满足的情况马上break进行下一个中心字符的判断,代码如下:
class Solution { public: string longestPalindrome(string s) { string ans; int len=s.length(); int maxLength=-1,CurLen,Sbegin; for(int i=0;i<len;i++) { int left=i-1,right=i+1; while(left>=0&&right<len&&s[left]==s[right])//奇数情况 { CurLen=right-left+1; if(CurLen>maxLength) { maxLength=CurLen; Sbegin=left; } left--,right++; } left=i,right=i+1; while(left>=0&&right<len&&s[left]==s[right])//偶数情况 { CurLen=right-left+1; if(CurLen>maxLength) { maxLength=CurLen; Sbegin=left; } left--,right++; } } ans=s.substr(Sbegin,maxLength); return ans; } };
具体算法介绍:点击打开链接
附上精巧的代码:
class Solution { public: string 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 longestPalindrome(string s) { string T = preProcess(s); int n = T.length(); int *P = new int[n]; int C = 0, R = 0; for (int i = 1; i < n-1; i++) { int i_mirror = 2*C-i; // equals to i' = C - (i-C) P[i] = (R > i) ? min(R-i, P[i_mirror]) : 0; // Attempt to expand palindrome centered at i while (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 (i + P[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; } } delete[] P; return s.substr((centerIndex - 1 - maxLen)/2, maxLen); } };
版权声明:本文为博主原创文章,未经博主允许不得转载。
[leetcode] Longest Palindromic Substring 多种解法
标签:leetcode 最长回文子串 string 多种解法
原文地址:http://blog.csdn.net/nk_test/article/details/46901657