1.暴力解法:
从第一个字符开始依次遍历。从第i位置的字符开始,然后从长到短依次比对该字符串是否为回文字符串
class Solution:
def longestPalindrome(self, s: str) -> str:
m = '' # Memory to remember a palindrome
for i in range(len(s)): # i = start, O = n
for j in range(len(s), i, -1): # j = end, O = n^2
if len(m) >= j-i: # To reduce time
break
elif s[i:j] == s[i:j][::-1]:
m = s[i:j]
break
return m
2.动态规划法
字符串“mabcban”中"bcb"为回文字符串,则当只需判断左边的b左边的字符和右边的b右边的字符是否相同即可。
class Solution:
def longestPalindrome(self, s: str) -> str:
dp = [[0] * len(s) for i in range(len(s))]#生成10*10的矩阵,用于记录
ans = ""
max_length = 0
for i in range(len(s) - 1, -1, -1):
'''从后往前'''
for j in range(i, len(s)):
'''若两个字符相同且相邻的字符也相同,则记为1'''
if s[i] == s[j] and (j - i < 2 or dp[i+1][j-1] == 1):
dp[i][j] = 1 #如果两个位置的字符相同,则在矩阵中记为1
if ans == "" or max_length < j - i + 1:
ans = s[i:j+1]
max_length = j - i + 1
return ans
3.在中心周围展开
每一个回文字符串必有一个中心字符,从中心字符开始向两边延伸比对。然后返回最长的字符。
class Solution:
def longestPalindrome(self, s: str) -> str:
if s == "":
return ""
end = 0 ;start = 0
for i in range(len(s)):
common = s[i]
left = i-1 ;right = i+1
while (left >= 0) and (right < len(s)) and (s[left] == s[right]):
left -= 1
right += 1
len1 = right - left - 1
left = i ;right = i+1
while (left >= 0) and (right < len(s)) and (s[left] == s[right]):
left -= 1
right += 1
len2 = right - left - 1
lenall = max(len1,len2)
if lenall > end - start :
start = i - int((lenall-1)/2)
end = i + int(lenall/2)
return s[start:end+1]
4.Manacher 算法
一个非平凡的算法,很难短时间内想出来。