不同的子串行演算法

2021-10-22 12:17:05 字數 1160 閱讀 9876

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

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

示例:

輸入:s =

"rabbbit", t =

"rabbit"

輸出:3

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

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

rabbbit

^^^^ ^^

rabbbit

^^ ^^^^

rabbbit

^^^ ^^^

思路:這是一道典型的動態規劃。要得到t在s**現的次數,我們可以先求出t的首字母在s**現的次數,然後得到t的前兩個字母在s**現的次數,依此類推…

而要得到t的前i個字母在s**現的次數,我們又可以先求t的前i個字母在s的前m-1(m為s的長度)子母**現的次數,那麼狀態轉移方程已經非常明顯了。

dp[i][j]表示在s的前i個字母**現t的前j個字母的次數,則狀態轉移方程為:

if(s[i] == t[j])dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j];

else dp[i][j] = dp[i - 1][j];

最後**如下:

class

solution

if(j ==0)

else}}

return

(int

)dp[m -1]

[n -1]

;}};

優化方案:從狀態轉移方程中我們可以發現dp[i][j]的值只與上一層的dp[i - 1][j - 1]和dp[i - 1][j]有關,所以我們可以只定義乙個一維陣列來存dp[i - 1]的情況,在進行狀態轉移時直接在dp[i - 1]上進行更新,從而可以減少空間的使用

源**如下:

class

solution

if(j ==0)

else}}

return

(int

)dp[n -1]

;}};

不同的子串行

leetcode 給定乙個字串 s 和乙個字串 t,計算在 s 的子串行中 t 出現的個數。乙個字串的乙個子串行是指,通過刪除一些 也可以不刪除 字元且不干擾剩餘字元相對位置所組成的新字串。例如,ace 是 abcde 的乙個子串行,而 aec 不是 題目資料保證答案符合 32 位帶符號整數範圍。示...

不同子串行

難度 hard 備註 出自leetcode 題目描述 package 不同子串行 version 1.0 date 2020 8 3 16 28 題目描述 給定兩個字串s和t,求s有多少個不同的子串與t相同。s的子串定義為在s中任意去掉0個或者多個字元形成的串。子串可以不連續,但是相對位置不能變。比...

32 不同的子串行

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