LeetCode 647 Medium 回文子串个数 Python

  • Post author:
  • Post category:python
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

 


版权声明:本文为qq_28327765原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。