题目链接:Longest Palindromic Substring

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.

这道题的要求是在字符串中找出最长回文子串。假设字符串长度小于等于1000,而且最长回文子串唯一。

1. 暴力查找

对每个子串判断是否是回文,遍历每个子串需要两层循环,时间复杂度O(n2),判断回文时间复杂度是O(n)。这里就不上代码了。。。

时间复杂度:O(n3)

空间复杂度:O(1)

2. 遍历中心点

由于回文是左右对称的,因此可以遍历字符串选定中心点,然后向两边扫描直到不是回文为止。总共有2n-1个(n个中心点是字符,n-1个中心点是2个相邻字符间隙)中心点,对于每个中心点向两边扫描时时间复杂度O(n)。

时间复杂度:O(n2)

空间复杂度:O(1)

 1 class Solution
 2 {
 3 private:
 4     int palindrome(string s, int b, int e)
 5     {
 6         while(b >= 0 && e < s.size() && s[b] == s[e])
 7             --b, ++e;
 8         return e - b - 1;
 9     }
10 
11 public:
12     string longestPalindrome(string s)
13     {
14         int b, l = 0;
15         for(int i = 0; i < s.size(); ++i)
16         {
17             int len = max(palindrome(s, i, i), palindrome(s, i, i + 1));
18             if(len > l)
19             {
20                 b = i - (len - 1) / 2;
21                 l = len;
22             }
23         }
24         
25         return s.substr(b, l);
26     }
27 };

3. Manacher算法

Manacher算法是针对寻找最长回文子串的线性算法。

这里不详细介绍了,想要了解的看这里

时间复杂度:O(n)

空间复杂度:O(1)