给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为1000。
示例 1:
输入: "babad" 输出: "bab" 注意: "aba"也是一个有效答案。
示例 2:
输入: "cbbd" 输出: "bb"
解法一:暴力破解,时间复杂度n^3
class Solution(object):
def longestPalindrome(self, s):
"""
:type s: str
:rtype: str
"""
s_len = len(s)
max_str = ""
max_len = 0
tmp_str = ""
tmp_len = 0
round_str_dict = {}
for i in range(0, s_len - 1):
tmp_str = s[i]
tmp_len = 1
for j in range(i + 1, s_len):
tmp_str += s[j]
tmp_len += 1
if not round_str_dict.has_key(tmp_str):
round_str_dict[tmp_str] = self.is_round_str(tmp_str)
if round_str_dict[tmp_str]:
if tmp_len > max_len:
max_len = tmp_len
max_str = tmp_str
if s_len !=0 and max_str == "":
max_str = s[0]
return max_str
def is_round_str(self, tmp_str):
tmp_str_len = len(tmp_str)
if tmp_str_len == 0:
return True
i = 0
j = tmp_str_len - 1
is_round_str = True
while i < j:
if tmp_str[i] == tmp_str[j]:
i += 1
j -= 1
else:
is_round_str = False
break
return is_round_str
方法二:动态规划
class Solution(object):
def longestPalindrome(self, s):
"""
:type s: str
:rtype: str
"""
s_len = len(s)
max_len = 0
max_str = ""
round_list = [[0 for i in range(0, s_len)] for j in range(0, s_len)]
for j in range(0, s_len):
for i in range(0, j + 1):
if j - i <= 1:
if (s[i] == s[j]):
round_list[i][j] = 1
if (j - i + 1) > max_len:
max_len = j - i + 1
max_str = s[i:j + 1]
else:
round_list[i][j] = 0
else:
if (s[i] == s[j]) and round_list[i + 1][j - 1] == 1:
round_list[i][j] = 1
if (j - i + 1) > max_len:
max_len = j - i + 1
max_str = s[i:j + 1]
else:
round_list[i][j] = 0
return max_str
三、O(n)解法,参考https://segmentfault.com/a/1190000003914228
class Solution(object):
def longestPalindrome(self, s):
"""
:type s: str
:rtype: str
"""
m_id = 0
max_id = 0
max_p_id = 0
s_tmp = "#" + "#".join(s) + "#"
s_tmp_len = len(s_tmp)
p_list = [0 for i in range(0, s_tmp_len)]
print p_list
for i in range(0, s_tmp_len):
# print "%s %s %s %s" % (s_tmp[i], i, m_id, max_id)
p_list[i] = min(p_list[2*m_id - i], max_id - i) if max_id > i else 1
while (i - p_list[i] >= 0 and i + p_list[i] < s_tmp_len) \
and s_tmp[i + p_list[i]] == s_tmp[i - p_list[i]]:
p_list[i] += 1
if p_list[i] > max_p_id:
m_id = i
max_id = i + p_list[i] - 1
max_p_id = p_list[i]
# return "".join(s[m_id - max_id : m_id + max_id].split("#"))
# print p_list
# print "%s %s" % (m_id, max_p_id)
return "".join(s_tmp[m_id-max_p_id+1:max_id].split("#"))
四、利用字符串翻转比对,获取最长回文
class Solution(object):
def longestPalindrome(self, s):
"""
:type s: str
:rtype: str
"""
n = len(s)
maxl = 0
start = 0
for i in xrange(n):
if i - maxl >= 0 and s[i-maxl: i+1] == s[i-maxl: i+1][::-1]:
start = i - maxl
maxl += 1
print "a %s %s %s" % (i, start, maxl)
continue
if i - maxl >= 1 and s[i-maxl-1: i+1] == s[i-maxl-1: i+1][::-1]:
start = i - maxl - 1
maxl += 2
print "b %s %s %s" % (i, start, maxl)
return s[start: start + maxl]