leetcode 不同的子串行

2021-10-12 14:02:28 字數 1158 閱讀 4400

給定乙個字串 s 和乙個字串 t ,計算在 s 的子串行中 t 出現的個數。

字串的乙個 子串行 是指,通過刪除一些(也可以不刪除)字元且不干擾剩餘字元相對位置所組成的新字串。(例如,「ace」 是 「abcde」 的乙個子串行,而 「aec」 不是)

題目資料保證答案符合 32 位帶符號整數範圍

輸入:s = 「rabbbit」, t = 「rabbit」

輸出:3

解釋:如下圖所示, 有 3 種可以從 s 中得到 「rabbit」 的方案。

(上箭頭符號 ^ 表示選取的字母)

rabbbit

^^^ ^^^

rabbbit

^^ ^^^^

rabbbit

^^^ – ^^

解題思路:

剛開始我想的是,直接遞迴+回溯,這樣肯定是能解出來的,但這樣就會走很多重複解,肯定會超時。看了答案,發現是動態規劃:

轉移方程是:

假設我們有字串 s = abcc 和 字串 abc

設定dp[i][j]為使用s的前j個字元能夠最多組成多少個t的前i個字元

當s[j] == t[i] 時:此時假設i=3,j=4,需要比較的是 abcc 中含有多少個abc

1.當考慮使用第j個元素時,即我們讓 abcc 中的最後乙個c 和abc最後乙個c匹配上,這時我們需要看的是 abc中含有多少個 ab ,對應dp[i-1][j-1]

2.當不考慮使用第j個元素時,我們需要看的是 abc 中含有多少個abc ,對應dp[i][j-1]

轉移方程為dp[i][j] = dp[i-1][j-1] + dp[i][j-1]
當s[j] != t[i] 時,此時假設i=3,j=4

只有一種情況,只需要看的是 abc 中含有多少個abc即可,對應dp[i][j-1]

轉移方程為dp[i][j] = dp[i][j-1]
舉個例子,如示例的

對於第一行, t 為空,因為空集是所有字串子集, 所以我們第一行都是 1

對於第一列, s 為空,這樣組成 t 個數當然為 0了

class

solution

}return dp[r]

[c];}}

;

leetcode 115 不同的子串行

思路 動態規劃 狀態定義 f x,y 記t中 0,x 範圍的子串為t 記s中 0,y 範圍的子串為s f x,y 表示在s 中t 出現的個數。狀態轉移 1 對於x 0的情況,a 當y 0時,如果s.charat 0 t.charat 0 則f 0,0 1 否則f 0,0 0。b 當y 0 時,如果s...

leetcode 115 不同的子串行

遞迴超時 唉 設dp i j 表示s 0 i 1 的子串行中t 0 j 1 出現的次數,則 1.若s i 1 t j 1 dp i j dp i 1 j 1 用s i 1 與t j 1 配對 dp i 1 j 拋棄s i 1 不用s i 1 與t j 1 配對 2.若s i 1 t j 1 dp i...

leetcode 115 不同的子串行

給定乙個字串 s 和乙個字串 t,計算在 s 的子串行中 t 出現的個數。乙個字串的乙個子串行是指,通過刪除一些 也可以不刪除 字元且不干擾剩餘字元相對位置所組成的新字串。例如,ace 是 abcde 的乙個子串行,而 aec 不是 示例 1 輸入 s rabbbit t rabbit 輸出 3 解...