一道题能否使用动态规划就在于判断最优结构是否是通过最优子结构推导得到?如果显然具备这个特性,那么就应该朝动态规划思考。如果令dp[i][j]表示串s[i:j+1]是否是回文子串,那么判断
dp[i][j]
是否是回文子串,相当于判断s[i] 与 s[j] 是否相等 + dp[i+1][j-1] 是否相等。
1. 题目
2. 分析
这道题我写了一个小时才写出来,相比之前看答案写题是有进步的。估计这道题我这半个月都不会忘记了。一道题能否使用动态规划就在于判断最优结构是否是通过最优子结构推导得到?如果显然具备这个特性,那么就应该朝动态规划思考。
具体看一个样例:s="babad"
,判断这个字符串是否是最长回文子串,相当于判断aba是否是回文子串和b与d是否相等。
0 | 1 | 2 | 3 | 4 |
---|---|---|---|---|
b | a | b | a | d |
相当于判断最后一个字符和要判断子串的第一个字符是否相等,外加判断内部子串是否是回文子串。
1 | 2 | 3 |
---|---|---|
a | b | a |
那么抽象一下,就可以得出:判断dp[i][j]
是否是回文子串,相当于判断s[i] 与 s[j] 是否相当 + dp[i+1][j-1] 是否相等。
3. 代码
python
class Solution:
def longestPalindrome(self, s: str) -> str:
dp = [[0] * len(s) for i in range(len(s))]
for cur_length in range(1, len(s)+1):
for i in range(0, len(s)):
j = i + cur_length - 1 # 终点下标
if j >= len(s): # 越界处理
continue
if j == i:
dp[i][j] = 1
continue
if cur_length == 2: # 长度为2的区间
if s[j] == s[i]:
dp[i][j] = 1
continue
if s[j] == s[i] and dp[i+1][j-1]: # 如果起点和终点相同
dp[i][j] = 1
# print(dp)
max_len = 0
res = ""
for i in range(len(s)):
for j in range(len(s)):
if dp[i][j] == 1:
if j-i+1 > max_len:
max_len = max(max_len, j-i+1)
res = s[i:j+1]
return res