1. 程式人生 > >LeetCode 647 Medium 迴文子串個數 Python

LeetCode 647 Medium 迴文子串個數 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