LeetCode題解(1639):統計只差一個字元的子串數目(Python)

長行發表於2020-11-10

題目:原題連結(困難)

標籤:動態規劃、雜湊表

解法時間複雜度空間複雜度執行用時
Ans 1 (Python) O ( H × ( W + T ) ) O(H×(W+T)) O(H×(W+T)) : W為單詞數量 H為單詞長度 T為目標單詞長度 O ( H × ( W + T ) ) O(H×(W+T)) O(H×(W+T))2012ms (64%)
Ans 2 (Python)
Ans 3 (Python)

解法一(動態規劃):

class Solution:
    def numWays(self, words: List[str], target: str) -> int:
        # 預處理單詞列表
        # O(W×H) W為單詞數量 H為單詞長度
        size = len(words[0])
        counts = [collections.Counter() for _ in range(size)]
        for word in words:
            for i, ch in enumerate(word):
                counts[i][ch] += 1

        # 生成狀態列表
        dp = [[0] * size for _ in range(len(target))]

        # 計算左上角
        if target[0] in counts[0]:
            dp[0][0] = counts[0][target[0]]

        # 計算第一行
        for j in range(1, size):
            dp[0][j] = dp[0][j - 1]
            if target[0] in counts[j]:
                dp[0][j] += counts[j][target[0]]

        # 計算其他位置
        for i in range(1, len(target)):
            for j in range(i, size):
                dp[i][j] = dp[i][j - 1]
                if target[i] in counts[j]:
                    dp[i][j] += dp[i - 1][j - 1] * counts[j][target[i]]

        return dp[-1][-1] % (10 ** 9 + 7)

相關文章