给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
示例 2:
输入: "cbbd"
输出: "bb"
方案一: 超时
class Solution:
def longestPalindrome(self, s: str) -> str:
newtarget = []
max_len = len(s)-1
if len(s) == 0 or len(s) == 1:
return s
while max_len:
for i in range(len(s)):
if i+max_len > len(s)-1:
continue
target = s[i:i+max_len+1]
newtarget = list(target)
if newtarget == newtarget[::-1]:
return target
max_len = max_len -1
return s[0]
方案二:
s = "babad"
res = s[0]
for i in range(len(s)):
for j in range(i + 1, len(s)):
if s[i] == s[j]:
if s[i:j+1] == s[i:j+1][::-1]:
res = s[i:j+1] if (len(s[i:j+1]) >= len(res)) else res
print(res)
方案三:中心扩展法
中心扩展就是把给定的字符串的每一个字母当做中心,向两边扩展,这样来找最长的子回文串。算法复杂度为O(N^2)。
需要考虑两种情况:
长度为奇数的回文串,比如a, aba, abcba
长度为偶数的回文串,比如aa, abba
#!/usr/bin/python
# -*- coding: utf-8 -*-
def max_substr(string):
s_list = [s for s in string]
string = '#' + '#'.join(s_list) + '#'
max_length = 0
length = len(string)
for index in range(0, length):
r_length = get_length(string, index)
if max_length < r_length:
max_length = r_length
return max_length
def get_length(string, index):
# 循环求出index为中心的最长回文字串
length = 0
r_ = len(string)
for i in range(1,index+1):
if index+i < r_ and string[index-i] == string[index+i]:
length += 1
else:
break
return length
if __name__ == "__main__":
result = max_substr("35534321")
print result
https://www.cnblogs.com/dahu-daqing/p/9302681.html