普通暴力法
暴力法的原理很简单,就是挨个判断子串是否为回文子串,但直接暴力法是无法通过的,所以可以在其基础上去除掉不必要的判断,代码如下:
class Solution:
def IsPalindrome(self, s: str):
reverse = s[::-1]
if s==reverse:
return True
else:
return False
def longestPalindrome(self, s: str) -> str:
length = len(s)
if length == 0 or length == 1:
return s
max_length = 1
result = s[0]
for i in range(length):
for j in range(length, i, -1):
substr = s[i:j]
if self.IsPalindrome(substr):
if j - i > max_length:
max_length = j - i
result = substr
break
if max_length >= length - i:
break
return result
动态规划
当然,这不是好的解法,进一步的,我们思考这个问题,上述判断回文字串的一个很明显的缺陷就是过多的重复判断,例如当我们知道为回文子串时,那么我们只需要知道,我们就可以判断为回文子串,基于此,我们就可以进行递归判断,使得复杂度降为:
class Solution:
def longestPalindrome(self, s: str) -> str:
if not s:
return ""
n = len(s)
is_palindrome = [[False] * n for _ in range(n)]
for i in range(n):
is_palindrome[i][i] = True
for i in range(1, n):
is_palindrome[i][i - 1] = True
longest, start, end = 1, 0, 0
for length in range(1, n):
for i in range(n - length):
j = i + length
is_palindrome[i][j] = s[i] == s[j] and is_palindrome[i + 1][j - 1]
if is_palindrome[i][j] and length + 1 > longest:
longest = length + 1
start, end = i, j
return s[start:end + 1]