leetcode115,字串T中序列S的個數

2021-09-20 18:55:44 字數 1617 閱讀 9376

**)原文: 

問題描述:

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

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

示例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

^^^

問題分析:

標準動態規劃題目,以s = "babgbag", t = "bag",為例,dp[i][j]表示字串s的前j個元素中有多少個 t的前i個元素,可以得到下圖:

計算dp[i][j]時要判斷s[j-1]==t[i-1],切勿搞錯

當i=2,j=6時,表示字串 'babgbag' 中有多少個 'bag',此時,要想知道現在有多少個'bag', 那麼只需知道 j=5 時有多少個 'ba' 和已經有了多少個'bag', 接著再判斷 s[j] ==t[i] 是否成立,如果成立,dp[i][j] = 'ba'的個數 + 已有'bag'的個數,dp[i][j] = 已有'bag'的個數。

所以dp方程式為:dp[i][j] = dp[i][j-1] + dp[i-1][i-j] * (t[i-1] == s[j-1])(dp[i][j-1]對應綠色方格,dp[i-1][i-j]對應黃色方格)。

**如下:

class solution 

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

此題另解:

遞迴求出s的所有子串行,求和s相同的子串行個數即可(此法leetcode超時)

void subsequence(string str1,int i,string t,string out,int &num)

subsequence(str1,i+1,t,out+str1[i],num);

subsequence(str1,i+1,t,out,num);

}int numdistinct(string s, string t)

11 5字串函式

c庫提供多個處理字串的函式,這些函式的原型放在string.h標頭檔案中 strlen函式用於統計字串的長度 下面的函式可以縮短字串的長度,用到了strlen void fit char string,unsigned int size 該函式要改變字串,所以在函式頭宣告時不能使用const限定 以...

ZPG TEST 115 字串 歸類思想

pdf效果太差,轉成word效果依舊差,只好轉成jpg傳了。這一題用到了 歸類 的思想,令s i,a 表示前i個字型,字元a出現的次數。那麼ans一定等於乙個 s i,a s j,a s i,b s j,b 歸一下類,得到ans等於乙個 s i,a s i,b s j,a s j,b 所以我們只需要...

字串 leetcode 43 字串相乘

給定兩個以字串形式表示的非負整數 num1 和 num2,返回 num1 和 num2 的乘積,它們的乘積也表示為字串形式。示例 1 輸入 num1 2 num2 3 輸出 6 示例 2 輸入 num1 123 num2 456 輸出 56088 說明 num1 和 num2 的長度小於110。nu...