資料結構篇_程式設計思想板塊_第五章圖
阿新 • • 發佈:2022-05-24
115. 不同的子序列
給定一個字串 s
和一個字串 t
,計算在 s
的子序列中 t
出現的個數。
字串的一個 子序列 是指,通過刪除一些(也可以不刪除)字元且不干擾剩餘字元相對位置所組成的新字串。(例如,"ACE"
是 "ABCDE"
的一個子序列,而 "AEC"
不是)
題目資料保證答案符合 32 位帶符號整數範圍。
示例 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
提示:
0 <= s.length, t.length <= 1000
-
s
和t
由英文字母組成
思路:
動態規劃問題,對於s的每個位置如果和t中字元相等,那麼就可以考慮選不選,否則就不選。
因此會出現重疊子問題,加入備忘錄即可。
class Solution { public: vector<vector<int>>memo; int numDistinct(string s, string t) { memo.resize(s.size(),vector<int>(t.size(),-1)); return dp(s,0,t,0); } int dp(string s,int i,string t,int j){ int m=s.size(),n=t.size(); if(j==n){ //t全部匹配完 return 1; } if(n-j>m-i){ //待匹配的子序列長度比字串還要小 return 0; } if(memo[i][j]!=-1){ return memo[i][j]; } int res=0; if(s[i]==t[j]){ res+=dp(s,i+1,t,j+1)+dp(s,i+1,t,j); }else{ res+=dp(s,i+1,t,j); } memo[i][j]=res; return res; } };