leetCode 115 [Distinct Subsequence]

原題

給出字符串S和字符串T,計算S的不同的子序列中T出現的個數。
子序列字符串是原始字符串通過刪除一些(或零個)產生的一個新的字符串,并且對剩下的字符的相對位置沒有影響。(比如,“ACE”“ABCDE”的子序列字符串,而“AEC”不是)。

樣例
給出S = "rabbbit", T =** "rabbit"**
返回 3

解題思路

  • 典型動態規劃 - Two Sequence DP

  • 狀態cache[i][j]表示 S前i位的不同子序列中有幾個和T的前j位相同

  • 初始化

  • cache[0][0] = 1 T和S都是空串,空串在空串中出現1次

  • cache[0][j] = 1 T是空串,S只有一種子序列(空串)可以匹配

  • cache[i][0] = 0 S是空串,T不是空串,S沒有子序列可以匹配

  • 狀態轉移方程

  • 當S[j] != T[i]的時候, cache[i][j] = cache[i][j - 1] //"ABCD"匹配"AC"的方式至少有"ABC"匹配"AC"那么多種

  • 當S[j] == T[i]的時候,還要加上cache[i - 1][j - 1]那么多種匹配方式

  • 如果狀態轉移方程比較難想,可以先畫圖找規律

Screenshot at Jun 05 00-07-26.png

完整代碼

class Solution(object):
    def numDistinct(self, s, t):
        """
        :type s: str
        :type t: str
        :rtype: int
        """
        if not s:
            return 0
        if not t:
            return 1
        
        cache = [[0 for j in range(len(s) + 1)] for i in range(len(t) + 1)]
        
        for j in range(len(s) + 1):
            cache[0][j] = 1
        
        for i in range(1, len(t) + 1):
            for j in range(1, len(s) + 1):
                if s[j - 1] == t[i - 1]:
                    cache[i][j] = cache[i][j - 1] + cache[i - 1][j - 1]
                else:
                    cache[i][j] = cache[i][j - 1]
                    
        return cache[len(t)][len(s)]
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,739評論 18 399
  • 計算機二級C語言上機題庫(南開版) 1.m個人的成績存放在score數組中,請編寫函數fun,它的功能是:將低于平...
    MrSunbeam閱讀 6,439評論 1 42
  • 背景 一年多以前我在知乎上答了有關LeetCode的問題, 分享了一些自己做題目的經驗。 張土汪:刷leetcod...
    土汪閱讀 12,766評論 0 33
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,837評論 18 139
  • 第5章 引用類型(返回首頁) 本章內容 使用對象 創建并操作數組 理解基本的JavaScript類型 使用基本類型...
    大學一百閱讀 3,265評論 0 4