leetcode 115 不同的子串行

2021-10-04 16:49:53 字數 1462 閱讀 6778

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

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

示例 1:

輸入: s = "rabbbit", t = "rabbit"

輸出: 3

解釋:

如下圖所示, 有 3 種可以從 s 中得到 "rabbit" 的方案 (上箭頭符號 ^ 表示選取的字母)

示例 2:

如下圖所示, 有 5 種可以從 s 中得到 "bag" 的方案。 

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

這是一道動態規劃題目,假設 dp[i][j] 表示字串 t[0,i-1] 在字串s[0,j-1]出現次數。

第一步找出狀態轉移方程:

求一般情況下 dp[i][j] 的值。

這裡分兩種情況:①字串t的第 ( i - 1) 個字元等於字串s的第( j - 1 )個字元。②兩個字元不相等

第二種比較容易推斷,不相等時,出現次數等於 dp[i][j-1] 次數(相當於刪除字串s的第( j - 1 )字元)

第一種情況下,出現次數等於 dp[i-1][j-1] + dp[i][j-1] 。這裡得考慮兩種情況,當字串s的第( j - 1 )字元不刪除時,出現次數跟

dp[i-1][j-1] 相同,刪除情況下,出現次數為 dp[i][j-1],兩種情況相加可得 dp[i-1][j-1] + dp[i][j-1]。

第二步考慮邊界情況:

當字串t長度為 0 時, 出現次數dp[0][x]( 0 =當字串s長度為 0 時, 字串t的所有子串出現次數都為0.

為方便理解,以示例2輸入進行填表:下標0

1234

567對應字元0b

abgb

ag00

1111

1111

1b01

2223

332a

0011

1144

3g00

0011

15

class solution 

for(int i = 1;i < t.length()+1;i++)else

}}

return dp[t.length()][s.length()];}}

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 解...