题目:给你一个字符串 s,找到 s 中最长的回文子串。
示例 1:
输入:s = “babad”
输出:“bab”
解释:“aba” 同样是符合题意的答案。
示例 2:
输入:s = “cbbd”
输出:“bb”
示例 3:
输入:s = “a”
输出:“a”
示例 4:
输入:s = “ac”
输出:“a”
思路:可以用动态规划的方法解决,先遍历字符串,当 s[i+1:j-1]是回文串,并且 s的第 i 和 j 个字母相同时,s[i:j]才会是回文串。这是字符串长度>2时候的情况,字符串长度=1一定是回文串,长度=2时判断字符是否一样即可。
代码:
class Solution:
def longestPalindrome(self, s: str) -> str:
n = len(s)
ans = ""
dp = [[False] * n for _ in range(n)]
# 枚举子串长度l+1
for l in range(n):
for i in range(n):
# 枚举子串的起始位置i,通过j=i+l得出结束位置
j = i + l
if j >= n:
break
if l == 0:
dp[i][j] = True
elif l == 1:
dp[i][j] = (s[i] == s[j])
else:
dp[i][j] = (dp[i + 1][j - 1] and s[i] == s[j])
if dp[i][j] and l + 1 >len(ans):
ans = s[i:j + 1]
return ans
题目来自LeetCode第5题