**)原文:
問題描述:
給定乙個字串 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...