5、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.
中文:
给定一个字符串
s
,找到s
中最长的回文子串。你可以假设s
的最大长度为 1000。示例
Example 1:
1
2
3Input: "babad"
Output: "bab"
Note: "aba" is also a valid answer.Example 2:
1
2Input: "cbbd"
Output: "bb"
解题思路
思路一
动态规划方法,维护一个二维数组$tags$,其中$tags[i][j]$表示字符串区间$[i,j]$是否为回文串,当$i=j$时,字符串只有一个字符,肯定是回文串,当$j=i+1$时,字符串为相邻的两个字符,需要判断$s[i]$是否等于$s[j]$,如果$i$和$j$不相邻,即$j-i\ge2$时,除了判断$s[i]$和$s[j]$是否相等,还要判断$tags[i+1][j-1]$是否为真,则有如下递推式:
代码提交
Python3,用时6708ms,内存21.9M
时间复杂度:$O(n^2)$
1 | class Solution: |
思路二
弱鸡的讲说,这个思路是一致的,但是代码没太看明白。。。
根据回文的特性,一个大回文按比例缩小后的字符串也必定是回文,比如ABCCBA,那BCCB肯定也是回文。所以我们可以根据动态规划的两个特点:
(1)把大问题拆解为小问题
(2)重复利用之前的计算结果
这道题。如何划分小问题,我们可以先把所有长度最短为1的子字符串计算出来,根据起始位置从左向右,这些必定是回文。然后计算所有长度为2的子字符串,再根据起始位置从左向右。到长度为3的时候,我们就可以利用上次的计算结果:如果中心对称的短字符串不是回文,那长字符串也不是,如果短字符串是回文,那就要看长字符串两头是否一样。这样,一直到长度最大的子字符串,我们就把整个字符串集穷举完了。
代码提交
Python3,用时160ms,内存13M
1 | class Solution: |
思路三
解决最长回文子串的一个时间复杂度为$O (n)$的算法——Manacher算法。
还没有仔细看,应该是针对该问题的一个比较巧妙的算法。
可参考:最长回文子串——Manacher 算法,LeetCode]最长回文子串(Longest Palindromic Substring)。