給定乙個字串 s 和乙個字串 t ,計算在 s 的子串行中 t 出現的個數。
字串的乙個 子串行 是指,通過刪除一些(也可以不刪除)字元且不干擾剩餘字元相對位置所組成的新字串。(例如,「ace」 是 「abcde」 的乙個子串行,而 「aec」 不是)
題目資料保證答案符合 32 位帶符號整數範圍。
示例 1:
輸入:s = 「rabbbit」, t = 「rabbit」
輸出:3
解釋:如下圖所示, 有 3 種可以從 s 中得到 「rabbit」 的方案。
(上箭頭符號 ^ 表示選取的字母)
rabbbit
^^^^ ^^
rabbbit
^^ ^^^^
rabbbit
^^^ ^^^
示例 2:
輸入:s = 「babgbag」, t = 「bag」
輸出:5
解釋:如下圖所示, 有 5 種可以從 s 中得到 「bag」 的方案。
(上箭頭符號 ^ 表示選取的字母)
babgbag
^^ ^
babgbag
^^ ^
babgbag
^ ^^
babgbag
^ ^^
babgbag
^^^0 <= s.length, t.length <= 1000
s 和 t 由英文本母組成
**如下:
class
solution
for(
int i=m-
1;i>=
0;i--)}
return ret[0]
[0];}};
需要注意的地方有:
建立儲存空間的時候需要用long這種資料型別,因為題目雖然保證了最後的結果在int範圍內,但是沒***中間變數在int範圍內(大意了,我沒有閃)
轉移方程的邏輯,只有當s中完全包含t時,出現次數的值才會移動到最左端
之所以會有if(s[i]==t[j]) ret[i][j]=ret[i+1][j+1]+ret[i+1][j];
是因為如果相同,則可以把除去首位的子串增添首位,出現次數不變,還可以替換上一位重複的字元組合。
**執行結果:
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 解...