【leetcode - 5】最长回文子串 medium
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
示例 2:
输入: "cbbd"
输出: "bb"
用这个题来复习一下动态规划: 1. 确定base : len = 1时一定是回文 len=2且元素相等时为回文 2. 确定变化的变量:回文子串长度 3. 导致状态变化的行为:两种方式,一种是记录回文子串的起止位置,一种是只记录中间位置 4. dp函数,即dp[i][j]=dp[i+1][j-1] s[i]=s[j] 且j-1-(i+1)>=1
如果考虑到python有反转的方法,可以直接用反转后的字符串是否等于本身作为判断
1 class Solution: 2 def longestPalindrome(self, s: str) -> str: 3 #初始化相关变量# 4 maxx = 1 5 start = 0 6 dp=[[False for _ in range(len(s))] for _ in range(len(s))] 7 #base# 8 if len(s)<2: 9 return s 10 for i in range(len(s)): 11 dp[i][i]=True 12 #遍历# 13 for j in range(1,len(s)): 14 for i in range(0,j): 15 if s[i]==s[j]: 16 if j-i>=3: 17 dp[i][j]=dp[i+1][j-1] 18 else: 19 dp[i][j]=True 20 else: 21 dp[i][j]=False 22 if dp[i][j]: 23 if j-i+1>maxx: 24 maxx = j-i+1 25 start = i 26 return s[start:start+maxx]
class Solution: def longestPalindrome(self, s: str) -> str: #base if len(s)<2 or s==s[::-1]: return s #初始化 start = 0 leng = 1 #循环选取右变量不是两边 for i in range(1,len(s)): #如果长度为奇数需要往前走长度+1的距离 left_odd = i-1-leng #如果长度为偶数 left_even = i-leng right= i+1 odd = s[left_odd:right] even = s[left_even:right] if left_odd>=0 and odd==odd[::-1]: leng+=2 start = left_odd elif left_even>=0 and even==even[::-1]: leng+=1 start = left_even #注意返回的最后的index不需要在长度基础上加一 return s[start:start+leng]
浙公网安备 33010602011771号