【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]
View Code
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]

 

  

posted @ 2020-10-14 19:34  Akassy  阅读(86)  评论(0)    收藏  举报