5.最长回文子串
给定一个字符串 s
,找到 s
中最长的回文子串。你可以假设 s
的最大长度为 1000。
示例 1:
输入: "babad" 输出: "bab" 注意: "aba" 也是一个有效答案。
示例 2:
输入: "cbbd" 输出: "bb"
三种思路:
思路 1:
把每个字母当成回文串的中心
这里要考虑两种情况,回文串的长度为奇数或者偶数情况。
思路 2: 把每个字母当成回文串的结束
思路 3: 动态规划
dp[j][i] 表示字符串从 j 到 i 是否是为回文串,即当 s[j] == s[i] 如果 dp[j+1][i-1] 也是回文串,那么字符串从 j 到 i 也是回文串,即 dp[j][i] 为真。
class Solution_01:
def longestPalindrome(self, s: str) -> str:
n = len(s)
self.res = ""
def helper(i,j):
while i >= 0 and j < n and s[i] == s[j]:
i -= 1
j += 1
if len(self.res) < j - i -1 :
self.res = s[i+1:j]
for i in range(n):
helper(i,i)
helper(i,i+1)
return self.res
class Solution_02:
def longestPalindrome(self, s: str) -> str:
if not s:
return ""
max_len = 1
n = len(s)
start = 0
for i in range(1, n):
even = s[i - max_len:i + 1]
odd = s[i - max_len - 1:i + 1]
# print(even,odd)
if i - max_len - 1 >= 0 and odd == odd[::-1]:
start = i - max_len - 1
max_len += 2
elif i - max_len >= 0 and even == even[::-1]:
start = i - max_len
max_len += 1
# print(start,max_len)
return s[start: start + max_len]
class Solution_03:
def longestPalindrome(self, s: str) -> str:
if not s :
return ""
res = ""
n = len(s)
dp = [[0] * n for _ in range(n)]
max_len = float("-inf")
for i in range(n):
for j in range(i + 1):
if s[i] == s[j] and (i - j <= 2 or dp[j + 1][i - 1]):
dp[j][i] = 1
if dp[j][i] and max_len < i + 1 - j:
res = s[j : i + 1]
max_len = i + 1 - j
return res
if __name__ == '__main__':
solution_01 = Solution_01()
solution_02 = Solution_02()
solution_03 = Solution_03()
print(solution_01.longestPalindrome('babad'))
print(solution_02.longestPalindrome('babad'))
print(solution_03.longestPalindrome('cbbd'))