LeetCode 647 Medium 回文子串个数 Python

75 篇文章 0 订阅
72 篇文章 0 订阅
def countSubstrings(self, s):
    """
    MyMethod1
    算法:动规
    思路:
        联想第5题,用动规记录和求出字符串s的所有是回文串的子字符串,然后用计数器counter技术
        一样也是先从单个字符是回文的dp[i][i]= True开始记录
        再到两个字符dp[i][i+1]  = s[i]==s[i+1]
        再到后面的多个字符的回文dp[i][j] = (dp[i+1][j-1] and s[i+1]==s[j-1])
        还是要注意遍历的方式
        for j in range(1,n)
            for i in range(j-1)
        先从j开始遍历,代表以j结束的子串,然后i再从0开始去循环到j
    """
    n = len(s)
    dp = [[False] * n for _ in range(n)]
    counter = 0
    for i in range(n):
        dp[i][i] = True
        counter += 1
    for i in range(1, n):
        if s[i - 1] == s[i]:
            dp[i - 1][i] = True
            counter += 1
    for j in range(1, n):
        for i in range(j - 1):
            if s[i] == s[j] and dp[i + 1][j - 1]:
                dp[i][j] = True
                counter += 1
    return counter

def countSubstrings1(self, s):
    """
    My Method 2
    算法:中间拓展
    思路:
        和上面类似,和第5题中找子回文串一样,从第i个位置或者第i与i+1个位置开始左右拓展,判断是不是
        回文串,如果是的话就计数
        可以拓展的中心位置有2n+1个
        所以getCount有两次,一次从i,i拓展,一次从i,i+1拓展
    """

    def getCount(l, r):
        counter = 0
        while l >= 0 and r <= len(s) - 1 and s[l] == s[r]:
            counter += 1
            l -= 1
            r += 1
        return counter
    counter = 0
    for i in range(len(s)):
        counter += getCount(i, i)
        counter += getCount(i, i + 1)
    return counter

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值