代码随想录算法训练营第五十七天丨647. 回文子串、516. 最长回文子序列

647. 回文子串

没接触过有点难想,题解思路比较直观。

动态规划写法:

class Solution:
    def countSubstrings(self, s: str) -> int:
        n = len(s)
        dp = [[False] * n for _ in range(n)]
        count = 0
        
        for i in range(n):
            dp[i][i] = True
            count += 1
        
        for i in range(n - 1):
            if s[i] == s[i + 1]:
                dp[i][i + 1] = True
                count += 1

        for length in range(3, n + 1):
            for start in range(n - length + 1):
                end = start + length - 1
                if s[start] == s[end] and dp[start + 1][end - 1]:
                    dp[start][end] = True
                    count += 1
        
        return count

双指针:

class Solution:
    def countSubstrings(self, s: str) -> int:
        def count_palindromes_around_center(left: int, right: int) -> int:
            count = 0
            while left >= 0 and right < len(s) and s[left] == s[right]:
                left -= 1
                right += 1
                count += 1
            return count
    
        total_palindromes = 0
        for i in range(len(s)):
            total_palindromes += count_palindromes_around_center(i, i)
            total_palindromes += count_palindromes_around_center(i, i + 1)
        
        return total_palindromes

516. 最长回文子序列

class Solution:
    def longestPalindromeSubseq(self, s: str) -> int:
        n = len(s)
        dp = [[0] * n for _ in range(n)]
        
        for i in range(n):
            dp[i][i] = 1

        for length in range(2, n + 1):
            for start in range(n - length + 1):
                end = start + length - 1
                if s[start] == s[end]:
                    dp[start][end] = dp[start + 1][end - 1] + 2
                else:
                    dp[start][end] = max(dp[start + 1][end], dp[start][end - 1])
        
        return dp[0][n-1]

总结:

动规还是需要大量经验的...看新题只能说有概率做出来。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值