用DP框架來思考 匹配目標字串的子序列 Distinct Subsequences_Leetcode #115

小松鼠
發佈於演算法專欄 個房間
閱讀時間約 8 分鐘

題目敘述 Distinct Subsequences

給定一個字串s和目標t,請問有多少個s的子序列可以完美匹配目標t ?

也就是說,有多少個s的子序列和目標t相等?


測試範例

Example 1:

Input: s = "rabbbit", t = "rabbit"
Output: 3
Explanation:
As shown below, there are 3 ways you can generate "rabbit" from s.

總共有三個,分別是:

rabbbit
^^^^ ^^

rabbbit
^^^ ^^^

rabbbit
^^ ^^^^

Example 2:

Input: s = "babgbag", t = "bag"
Output: 5
Explanation:
As shown below, there are 5 ways you can generate "bag" from s.

總共有五個,分別是:

babgbag
^^ ^

babgbag
^^ ^

babgbag
^ ^^

babgbag
^ ^^

babgbag
^^^

約束條件

Constraints:

  • 1 <= s.length, t.length <= 1000

字串s, t 的長度都介於1~1000之間。

  • s and t consist of English letters.

字串s, t都只會有英文字母。


觀察 怎麼讓s去匹配目標t

以s= 'dogg', t = 'dog'為例

如果現在字尾相等 g = g ,那接下來有兩個選擇:

  1. 讓目前字尾匹配t,s,t各自往前移動試著比較'dog' 和 'do'
  2. 捨棄這個機會,t保持不動,s往前移動試著匹配t,比較'dog' 和 'dog'


承接剛才的討論,假如剛剛選擇1.,那麼接著比較'dog'和'do'

這時侯字尾相異 'g' =/= 'o',接下來只有一個選擇:

沒有機會匹配,s往前移動試著匹配t,比較'do' 和 'do'


總結歸納匹配模式如下:

當字尾相等時,接下來有兩個選擇

1.讓目前字尾匹配t,s,t各自往前移動試著比較前綴字串。
2.捨棄這個機會,t保持不動,s往前移動試著匹配t。


當字尾相異時,只有一個選擇

沒有機會匹配,t保持不動,s往前移動試著匹配t。


如此反覆匹配流程,直到t剩下空字串時,代表找到一組子序列匹配目標t。

如果過程中發現s(匹配的材料)剩下空字串,而且t不是空字串,代表無解


演算法 DP動態規劃 + 字元匹配

1.定義DP狀態

DP[i, j] 代表 s[0~i] 能匹配 t[0~j] 的子序列總數目。


那最終所求是什麼?

目標是s能匹配t的子序列總數目 = ​DP[ len(s)-1, len(t)-1 ]


2.推導DP狀態轉移關係式

承接觀察點的討論


歸納匹配模式如下:

當字尾相等時,接下來有兩個選擇

1.讓目前字尾匹配t,s,t各自往前移動試著比較前綴字串。
2.捨棄這個機會,t保持不動,s往前移動試著匹配t。


DP[i, j]

= 選擇1的方法數 + 選擇2的方法數

= DP[i-1, j-1] + DP[i-1, j], if s[i] == t[j]


當字尾相異時,只有一個選擇

沒有機會匹配,t保持不動,s往前移動試著匹配t。

DP[i, j]

= 唯一一種選擇的方法數

= DP[i-1, j], if s[i] != t[j]


3.釐清DP初始條件

什麼是最小規模的問題?


如果過程中,目標t只剩下空字串時,代表找到一組子序列匹配目標t

DP[i, j] = 1, if j = -1


如果過程中,發現s(匹配的材料)剩下空字串(材料用完了),而且t不是空字串,
代表無解

DP[i, j] = 0 無解, if i = -1

程式碼 DP動態規劃 + 字元匹配

class Solution:
def numDistinct(self, s: str, t: str) -> int:

# DP Table
dp = {}

def match(i, j):

if (i, j) in dp:
# Look-up DP Table
return dp[i, j]

if j == -1:
# If target is empty stinrg, then s is subsequence by removing all characters
dp[i, j] = 1
return 1

elif i == -1:
# If source empty string, then it is impossible to have matching subsequence
dp[i, j] = 0
return 0

elif s[i] == t[j]:

# current character is match, backtrack to
# matching on s[ 0...(i-1) ], t[ 0...(j-1) ], or
# matching on s[ 0...(i-1) ], t[ 0...(j) ]
dp[i, j] = match(i-1, j-1) + match(i-1, j)
return dp[i, j]

else:

# current character is mismatch, backtrack to
# matching on s[ 0...(i-1) ], t[ 0...(j) ]
dp[i, j] = match(i-1, j)
return dp[i, j]

# ==================================================
return match(len(s)-1, len(t)-1 )


複雜度分析

令字串s的長度為m
令字串t的長度為n

時間複雜度:O(mn)

s的index和t的index做匹配,最多有O(m*n)個匹配格子點。


空間複雜度:O(mn)

最多有O(m*n)個匹配格子點,每個格子點需要紀錄對應的匹配子序列數量。


關鍵知識點 怎麼讓s去匹配目標t


歸納匹配模式如下:

當字尾相等時,接下來有兩個選擇

1.讓目前字尾匹配t,s,t各自往前移動試著比較前綴字串。
2.捨棄這個機會,t保持不動,s往前移動試著匹配t。


當字尾相異時,只有一個選擇

沒有機會匹配,t保持不動,s往前移動試著匹配t。


如此反覆匹配流程,直到t剩下空字串時,代表找到一組子序列匹配目標t。

如果過程中發現s(匹配的材料)剩下空字串,而且t不是空字串,代表無解


Reference

[1] Distinct Subsequences - LeetCode


回到DP特訓班目錄 和 學習路徑

52會員
339內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
發表第一個留言支持創作者!
你可能也想看
用英文叫別人「別那麼急/別那麼激動」遛狗結果狗狗在路上暴走、孩子看到遊樂園等不及要衝了、朋友說話太嗨讓你快要跟不上。用三句英文讓對方或你的毛小孩「消消火」。
Thumbnail
avatar
你的英日語自學導師 譯難忘  ོꦿ༄꧁꧂
2023-12-12
用一個英文單字講人有多麼「跩」「唉呦很跩喔」、「很『秋』哦」,中文的跩和台語的秋,可以形容人很得意有自信又有點霸氣。就這麼剛好英文的own這個字可以傳達出這種fu。想知道怎麼使用嗎?這篇用超白話讓你秒懂。
Thumbnail
avatar
你的英日語自學導師 譯難忘  ོꦿ༄꧁꧂
2023-10-24
用 SEO 思維規劃以終為始的行銷策略:以 ChoozSEO 為例聊聊如何用 AI主題關鍵字工具來優化內容策略,並從中獲得更多洞見。
Thumbnail
avatar
Sho 的路上觀察手記
2023-10-18
用最簡單的日文問:「可以跟你合照嗎?」邀請日本人一起合照,卻不知道怎麼開口說出來嗎?看完這篇,馬上能現學現賣。
Thumbnail
avatar
你的英日語自學導師 譯難忘  ོꦿ༄꧁꧂
2023-10-05
用邏輯改變世界專訪(下)弱連結,真「有」用?你會察言觀色嗎?突破認知!|怪獸科技公司怪獸科技公司第二季,一起培養在快速變化社會的超強適應力!專案管理(PM)不僅涉及技術和流程的掌握,更重要的是人際溝通能力。過去曾擔任 PM 的 Davina 將帶我們深入解析 AI 時代下,她自己是養成溝通能力的一些好用方法,以及持續創新、突破認知邊界的意義。
Thumbnail
avatar
王政皓|怪獸科技公司
2023-08-30
用SPSS進行HLM第五章:步驟策略和解釋變異量測量本文章將介紹實務中進行HLM會需要注意的事項,包含樣本量要求、基本假設、計算解釋變異量和HLM建構策略。
Thumbnail
avatar
Dr. Rover
2023-08-15
劇評|《D.P:逃兵追緝令2》:走在「永恆回歸」的背後,依舊選擇戰鬥《D.P:逃兵追緝令2》雖然口碑不如第一季,但絕對不會不好看!與第一季劇情緊密相連的續作,依舊在想探討裡的主題中不停輪迴、深化、留白,留下餘韻十足的後續後,讓我們自行思考答案。雖然最後沒有給我像第一季曹石峰開槍自縊時的震撼,第二季曹石峰回歸的結尾,卻在溫暖中有了一絲「真的可以改變」甚麼的力量。
Thumbnail
avatar
夜半の故事備忘錄
2023-08-04
Netflix 原創韓劇《D.P:逃兵追緝令》,揭露韓國軍營霸凌問題的真實與震撼~D.P:逃兵追緝令 (共2季) | 評價 9/10 | awwrated https://awwrated.com/netflix/81280917 如果你對韓國的兵役制度有所了解,你可能會知道,那裡並不是一個充滿友愛和正義的地方。相反,那裡充斥著權力的濫用、暴力的威脅、心理的折磨和人性的扭曲。
Thumbnail
avatar
awwrated
2023-08-02
用SPSS進行HLM第四章:三層次之隨機截距斜率模型接續第三章內容,有時候多層次資料不只一個層次,可能具有多種層次,例如:學生屬於某個學校,而學校又屬於某個縣市。本章主要說明三層次之隨機截距模型的公式和SPSS操作,我們先從公式開始,然後在教學SPSS視窗和語法操作,相信看完後,讀者就會了解三層次之隨機截距斜率模型概念和操作。
Thumbnail
avatar
Dr. Rover
2023-07-26
用SPSS進行HLM第三章:雙層次之隨機截距斜率模型接續第二章內容,本章主要說明雙層次之隨機截距模型的公式和SPSS操作,我們先從公式開始,然後在教學SPSS視窗和語法操作,相信看完後,讀者就會了解雙層次之隨機截距斜率模型概念和操作。
Thumbnail
avatar
Dr. Rover
2023-07-13