LeetCode 647 Medium 迴文子串個數 Python
阿新 • • 發佈:2019-01-13
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