【LeetCode】115. 不同的子序列
阿新 • • 發佈:2018-12-15
題目描述
給定一個字串 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 ^^^
思路
dp[ i ][ j ] 表示 s 的前 i 個字母和 t 的前 j 個字母匹配的個數!
當 s 為空時,匹配個數為 0,故 dp[ 0 ][ j ] = 0;
當 t 為空時,匹配個數為1,故 dp[ i ][ 0 ] = 1;
當第 s 的第 i 個字母等於 t 的第 j 個字母時(即 s [ i - 1] == t [ j - 1])時,dp[ i ][ j ] 等於第 i 個字母匹配的結果(dp[ i - 1][ j - 1] )加上第 i 個字母不匹配的結果(dp[ i - 1][ j ]);當 s [ i - 1] != t [ j - 1] 時,dp[ i ][ j ] = dp[ i - 1][ j ]。
程式碼
class Solution { public: int numDistinct(string s, string t) { int m = s.size(); int n = t.size(); if(m == 0 || n == 0) return 0; vector<vector<int>> dp(m+1,vector<int>(n+1,0)); for(int i=0; i<=m; i++) dp[i][0] = 1; for(int i=1; i<=m; i++){ for(int j=1; j<=n; j++){ if(s[i-1] != t[j-1]){ dp[i][j] = dp[i-1][j]; }else{ dp[i][j] = dp[i-1][j] + dp[i-1][j-1]; } } } return dp[m][n]; } };