题目
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为1000。
示例:
示例 1:
输入: "babad"
输出: "bab"
注意: "aba"也是一个有效答案。
示例 2:
输入: "cbbd"
输出: "bb"
解法一:暴力循环法
循环三次字符串,每次循环检查的是否是回文串。
示例
class Solution(object):
def longestPalindrome(self, s):
"""
:type s: str
:rtype: str
"""
# 解法一
# 最大长度
max_length = 0
# 回文串
palindromic = ''
# 如果s长度为0或1可以直接返回s
if len(s) == 1 or len(s) ==0:
return s
# 遍历回文串头
for i in range(len(s)):
# 遍历回文串尾
for j in range(i+1, len(s)):
is_palindromic = True
for k in range(i, int((i+j)/2)+1):
# 检验是否是回文串
if s[k] != s[j-k+i]:
is_palindromic = False
break
# 如果是回文串且长度比之前的都长
if is_palindromic and (j-i+1)>max_length:
max_length = j-i+1
palindromic = s[i: j+1]
if palindromic == '':
palindromic = s[0]
return palindromic
执行结果
时间复杂度太高超出时间限制…
解法二:中心枚举法
通过枚举字符串子串的中心而不是起点,向两边同时扩散,依然是逐一判断子串的回文性。这种优化算法比之前第一种算法在最坏的情况下(即只有一种字符的字符串)效率会有很大程度的上升。
示例
class Solution(object):
def longestPalindrome(self, s):
"""
:type s: str
:rtype: str
"""
# 解法二
l = len(s)
max_length = 0
palindromic = ''
# 如果s长度为0或1可以直接返回s
if l == 1 or l == 0:
return s
for i in range(l):
# 回文串长度为奇数
x = 1
while (i - x) >= 0 and (i + x) < l:
if s[i + x] == s[i - x]:
x += 1
else:
break
x -= 1
if 2 * x + 1 > max_length:
max_length = 2 * x + 1
palindromic = s[i - x:i + x + 1]
# 回文串长度为偶数
x = 0
if (i + 1) < l:
while (i - x) >= 0 and (i + 1 + x) < l:
if s[i + 1 + x] == s[i - x]:
x += 1
else:
break
x -= 1
if 2 * x + 2 > max_length:
max_length = 2 * x + 2
palindromic = s[i - x:i + x + 2]
if palindromic == '':
palindromic = s[0]
return palindromic
执行结果
解法三:动态规划法
这种方法是在网上看到的,采用动态规划的方法,只考虑比原最长回文串长的情况。设原最长回文串为P(j, i),下次循环i +=1,新的最长回文串只可能是P(j-1, i+1)或P(j, i +1),所以只需判断这两种情况即可.
示例
class Solution(object):
def longestPalindrome(self, s):
"""
:type s: str
:rtype: str
"""
# 解法三
n = len(s)
max_length = 0
start = 0
for i in range(n):
# 原回文串的左右两边值相等
if i - max_length >= 1 and s[i - max_length - 1: i + 1] == s[i - max_length - 1: i + 1][::-1]:
start = i - max_length - 1
max_length += 2
continue
# 原回文串右边加+1还是回文串的情况
if i - max_length >= 0 and s[i - max_length: i + 1] == s[i - max_length: i + 1][::-1]:
start = i - max_length
max_length += 1
return s[start: start + max_length]