Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.
Example:
Input: "babad" Output: "bab" Note: "aba" is also a valid answer.
Example:
Input: "cbbd" Output: "bb"最长回文子串求解
1.暴力穷举法(O(n^3)) 略
2.动态规划
时间O(n^2),空间O(n^2)
一个大回文按比例缩小一定也是回文,比如ABCCBA,那BCCB肯定也是回文。因此先把一个字符和两个相同字符的找出来(一定是回文)然后向两侧扩展,符合条件的全都保存下来,最后取最大的,这样的缺点是浪费空间。
3.中心扩展法
时间O(n^2),空间O(1)
这种解法中,外层循环遍历的是子字符串的中心点,内层循环则是从中心扩散,一旦不是回文就不再计算其他以此为中心的较大的字符串。由于中心对称有两种情况,一是奇数个字母以某个字母对称,而是偶数个字母以两个字母中间为对称,所以我们要分别计算这两种对称情况。
class Solution(object):
def longestPalindrome(self, s):
"""
:type s: str
:rtype: str
"""
start = end = 0
maxlength = 0
if len(s) == 0 or len(s) == 1:
return s
for i in range(1,len(s)-1):
left = i-1
right = i+1
while left>=0 and right<=len(s)-1 and s[left]==s[right]:
if maxlength < right-left+1:
maxlength = right-left+1
start = left
end = right
left -= 1
right += 1
for i in range(0, len(s)-1):
left = i
right = i+1
while left >=0 and right<=len(s)-1 and s[left] == s[right]:
if maxlength < right-left+1:
maxlength = right-left+1
start = left
end = right
left -= 1
right += 1
return s[start:end+1]