python–leetcode–字符串之动态规划
5.最长回文子串
最长回文子串:给定一个字符串s,找到s的最长回文子串
思路:假设给定字符串’ababc’,使用dp[l][r]表示当前字串l,r是否是回文串,其中l指代左指针索引,r指代右指针索引。得到结果如下表所示
a | b | a | b | c | |
---|---|---|---|---|---|
a | 1 | 0 | 1 | 0 | 0 |
b | 1 | 0 | 1 | 0 | |
a | 1 | 0 | 0 | ||
b | 1 | 0 | |||
c | 1 |
def longestPalindrome(s):
lens = len(s)
if lens <= 1:
return s
# 状态:dp[l,r]包括 l,r ,表示的字符串是不是回文串
dp = [[False]*lens for _ in range(lens)]
max_len = -1
res = (-1, -1) # 设置初始索引
for r in range(lens):
for l in range(r + 1):
# 状态转移方程:1.如果头尾字符相等并且中间也是回文
# 2.如果头尾长度小于等于2,也是回文
if s[l] == s[r] and (r - l <= 2 or dp[l + 1][r - 1]):
dp[l][r] = True
cur_len = r - l + 1
if cur_len > max_len:
max_len = cur_len
res = (l, r)
return s[res[0] : res[1]+1]