Leetcode 115 不同的子串行

2021-10-22 12:06:48 字數 1304 閱讀 4087

這一題很頭疼,一開始不會,看了題解認為很簡單。但是在做的時候發現細節很多,花了大量的時間才想出來。但是還是有一些需要回顧一下。

給定乙個字串 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 解...