5. 最长回文子串&&516. 最长回文子序列

给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

示例 1:

输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
示例 2:

输入: "cbbd"
输出: "bb"

方法:

1.中心扩散法

2.动态规划,坑啊,a=[[0]*length]*length生成的二维数组是畸形的,如a[i][j]=9,然而全部的j列都成9了,用列表生成式

class Solution(object):
    def longestPalindrome(self, s):
        if not s:
            return ""
        length = len(s)
        left = 0 
        right = 0
        res = 1
        maxlen = 0
        maxstart = 0
        for i in range(length):
            left = i-1
            right = i+1
            while left>=0 and s[left]==s[i]:
                res+=1
                left -=1
            while right<length and s[right]==s[i]:
                res+=1
                right+=1
            while left>=0 and right<length and s[left]==s[right]:
                res+=2
                left-=1
                right+=1
            if res>maxlen:
                maxlen = res
                maxstart = left
            res=1
        return s[maxstart+1:maxstart+maxlen+1]

class Solution(object):
    def longestPalindrome(self, s):
        if not s:
            return ""
        length = len(s)
        maxstart = 0
        maxend = 0
        maxlen = 1
        dp = [[0]*length]*length
        for r in range(1,length):
            for l in range(r):
                if s[l]==s[r] and (r-l<=2 or dp[l+1][r-1]==1):
                    dp[l][r] = 1
                    if r-l+1>maxlen:
                        maxlen = r-l+1
                        maxstart = l
                        maxend = r
        print(maxstart)
        print(maxend)
        return s[maxstart:maxend+1]

给定一个字符串s,找到其中最长的回文子序列。可以假设s的最大长度为1000

示例 1:
输入:"bbbab"

输出:4

class Solution(object):
    def longestPalindromeSubseq(self, s):
        """
        :type s: str
        :rtype: int
        dp[i] = max(dp[i-1],dp[i]+1)
        """
        n = len(s)
        if s == s[::-1]:
            return n
        tmp = [[0 for i in range(n)] for j in range(n)]
        for i in range(n):
            tmp[i][i] = 1
            for j in range(i-1,-1,-1):
                if s[i]==s[j]:
                    tmp[j][i]=2+tmp[j+1][i-1]
                else:
                    tmp[j][i]=max(tmp[j+1][i],tmp[j][i-1])
        return tmp[0][n-1]
发布了155 篇原创文章 · 获赞 17 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_36328915/article/details/104278085