1.暴力法
求出每个子串,之后判断是不是回文,找到最长的那个。
def find_longest_palindromes(s):
maxLength = 0
start = 0
for i in range(len(s)):
for j in range(i+1, len(s)):
temp1 = i
temp2 = j
while temp1 < temp2:
if s[temp1] != s[temp2]:
break
temp1 += 1
temp2 -= 1
if temp1 >= temp2 and j - i > maxLength:
maxLength = j - i + 1
start = i
if maxLength > 0:
print maxLength
print s[start:start+maxLength]
2.动态规划
回文字符串的子串还是回文,如p[i,j]是回文,则p[i+1,j-1]也是回文,需要额外空间O(N^2),时间复杂度O(N^2)
p[i,j]=0: 表示子串[i,j]不是回文串,=1:表示子串[i,j]是回文串
p[i.j] = p[i+1,j-1] if s[i] == s[j]
= 0 if s[i] != s[j]
def find_longest_palindrome_dp(s):
n = len(s)
longest_begin = 0
max_len = 1
dp = [[0] * (n) for i in range(n)]
for i in range(n):
dp[i][i] = 1
for i in range(n-1):
if s[i] == s[i+1]:
dp[i][i+1] = 1
longest_begin = i
max_len = 2
for le in range(3,n+1):
for i in range(0, n - le + 1):
j = i + le - 1
if s[i] == s[j] and dp[i+1][j-1]:
dp[i][j] = 1
longest_begin = i
max_len = le
return s[longest_begin:longest_begin+max_len]
3.中心扩展法
# 时间复杂度O(N^2),空间复杂度O(1)
# 就是对给定的字符串S,分别以该字符串S中的每一个字符C为中心,向两边扩展,
# 记录下以字符C为中心的回文子串的长度,
# 需要注意的是,回文可能是aba,也可能是abba