给定一个字符串 s
,找到 s
中最长的回文子串。你可以假设 s
的最大长度为 1000。
回文串:正反都一样的字符串
分析:
以每个字符为中心,判断每个字符左右是否相等,时间复杂度为O(n*n)
但要注意字符个数的奇偶情况,偶数个就以中间两个字符作为中心,奇数个就以一个字符作为中心
class Solution { public: void equal(string s,int l,int r,int &start,int &maxlen){ int len = s.size(); while(l>=0 && r<=len-1 && s[r]==s[l]){ l--;r++; } if(maxlen<r-l-1){ maxlen = r-l-1; start = l+1; } } string longestPalindrome(string s) { int len = s.size(); int r,l; int start=0,maxlen=0; if(len<=1) return s; for(int i=0;i<len-1;i++){ l = i;r = i; equal(s,l,r,start,maxlen); l = i;r = i+1; equal(s,l,r,start,maxlen); } return s.substr(start,maxlen); } };
解法2:动态规划,
对于[i,j]区间内为回文串,dp[i][j] = 1,有
- i = j ,一个字符肯定有dp[i][j] = 1
- i = j-1,dp[i][j] = (s[i]==s[j])
- i > j-1,dp[i][j] = s[i]==s[j] && dp[i+1][j-1]
解法3:马拉车算法Manacher's Algorithm