给你一个字符串 s
,找到 s
中最长的回文子串。
如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。
示例 1:
输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。
示例 2:
输入:s = "cbbd"
输出:"bb"
提示:
1 <= s.length <= 1000
s
仅由数字和英文字母组成
这题常规思路是用动规,如果一个回文串前后相邻的两字符相同,那么就可以扩张成一个新回文串。边界条件就是子串的长度为1或2,长为1的子串自然是回文串,长为2若两个字符相同那么也是回文串。换个角度我们也可以从边界条件外推,也就是中心扩展法。
class Solution:
def longestPalindrome(self, s: str) -> str:
# dp(i,j)表示s[i..j]是否是回文喘
# dp[i,i] = 1
# dp(i,i+1) = 1 when s[i]==s[i+1]
# dp(i,j) = 1 when dp(i+1,j-1)==1 and s[i]==s[j]
# 从边界条件向外扩展
def expand(s, l, r):
while l >= 0 and r < len(s) and s[l] == s[r]:
l -= 1
r += 1
return l+1, r-1
l, r = 0, 0
for i in range(len(s)):
l1, r1 = expand(s, i, i) # 边界条件 长度为1的子串
l2, r2 = expand(s, i, i+1) # 边界条件 长度为2的子串
if (r1-l1) > (r-l):
l, r = (l1, r1)
if (r2-l2) > (r-l):
l, r = (l2, r2)
return s[l: r+1]
标签:子串,r2,边界条件,字符串,最长,dp,回文 From: https://www.cnblogs.com/Aikoin/p/18184841