LeetCode 第7天 动态规划 (回文子串 )python

以下题目来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/palindromic-substrings
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

647. 回文子串
给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。

回文字符串 是正着读和倒过来读一样的字符串。

子字符串 是字符串中的由连续字符组成的一个序列。

具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。

class Solution:
    def countSubstrings(self, s: str) -> int:
        #dp[i][j]表示区间范围[i,j]的子串是否为回文字符串
        #遍历顺序从下到上从左到右
        """
        递推关系 if s[i]==s[j]: 
            #在判断i与j之间的距离
            if j-i<2: dp[i][j]=True
            elif dp[i+1][j-1]:
                dp[i][j]=True
        """
        dp=[[False]*len(s) for _ in range(len(s))]
        # for i in range(len(s)):
        #     dp[i][0]=True
        res=0
        for i in range(len(s)-1,-1,-1):
            for j in range(i,len(s)):
                if s[i]==s[j]:
                    if j-i<2: 
                        res=res+1
                        dp[i][j]=True
                    else:
                        if dp[i+1][j-1]:
                            res=res+1
                            dp[i][j]=True
        return res

516. 最长回文子序列
给你一个字符串 s ,找出其中最长的回文子序列,并返回该序列的长度。

子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。

class Solution:
    def longestPalindromeSubseq(self, s: str) -> int:
        #dp[i][j]表示 区间[i,j]之间最大的回文长度
        # 递推关系
        """
        if s[i]==s[j]:
            dp[i][j]=dp[i-1][j-1]+2
        else:
            #说明字符的同时加入不能使字符串成为回文字 分别加入
            dp[i][j]=max(dp[i+1][j],dp[i][j-1])
        """
        dp=[[0]*len(s) for _ in range(len(s))]
        for i in range(len(s)):
            dp[i][i]=1
        for i in range(len(s)-1,-1,-1):
            for j in range(i+1,len(s)):
                if s[i]==s[j]:
                    dp[i][j]=dp[i+1][j-1]+2
                else:
                    dp[i][j]=max(dp[i+1][j],dp[i][j-1])
        return dp[0][-1]

好耶!俺学完动态规划了 下一章学习二叉树相关问题

你可能感兴趣的:(Leetcode,leetcode,动态规划,python)