這一題很頭疼,一開始不會,看了題解認為很簡單。但是在做的時候發現細節很多,花了大量的時間才想出來。但是還是有一些需要回顧一下。
給定乙個字串 s 和乙個字串 t ,計算在 s 的子串行中 t 出現的個數。
字串的乙個 子串行 是指,通過刪除一些(也可以不刪除)字元且不干擾剩餘字元相對位置所組成的新字串。(例如,"ace" 是 "abcde" 的乙個子串行,而 "aec" 不是)
題目資料保證答案符合 32 位帶符號整數範圍。
輸入:s = "rabbbit", t = "rabbit"
輸出:3
解釋:如下圖所示, 有 3 種可以從 s 中得到 "rabbit" 的方案。
(上箭頭符號 ^ 表示選取的字母)
rabbbit
^^^^ ^^
rabbbit
^^ ^^^^
rabbbit
^^^ ^^^
毫無疑問,本題需要用動態規劃,這一點大多數人都可以想出來。但是動態規劃的難點在於狀態轉移方程,確切的說是如何定義 dp 陣列,dp[i][j]的含義是什麼, 如果能搞懂這一點,那麼動態規劃題就很簡單。
我們很容易想到,需要判斷 s[i] 與 t[j] 是否相等,那麼dp[i][j]我們可以設定為 s 的前 i 個字元與 t 的前 j 個字元匹配的數目,或者說是 t 的前 j 個字元在s 的前 i 個字元**現的次數。
而區分條件是 s 的第 i 個字元與 t 的第 j 個字元是否相等。如果相等,我們可以選擇是否用 t 的第 j 個字元去與 s 的第 i 個字元進行匹配,如果匹配,有dp[i - 1][j - 1]種方法,因為第 i 個字元與第 j 個字元相等,那麼 s 的前 i - 1個字元與 t 的前 j - 1個字元一定匹配,也就是 t 的前 j - 1個字元在s 的前 i - 1個字元**現的次數。如果不匹配,有dp[i][j - 1]種方法;如果不相等,有dp[i - 1][j]種方法。因此狀態轉移方程為:
if
(s[i -1]
== t[j -1]
)else
需要注意的是,當 t 為空字元時,s 的任意字串**現的次數均為 1 。這裡,dp[0][0]代表s、t均為空的情況,而不是指s、t中的第 0 個字元的匹配。
具體**如下所示:
class
solution
else}}
} sum = dp[len1]
[len2]
;return sum;}}
;
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 解...