给你两个字符串 s
和 t
,统计并返回在 s
的 子序列 中 t
出现的个数。
题目数据保证答案符合 32 位带符号整数范围。
dp[i][j]:以i-1结尾的s子序列中出现以j-1结尾的t的个数。
初始化时:dp[i][0]=1
1.当s[i-1]==t[j-1]时,dp[i][j]可以由两种情况得到:一种是用s[i-1]来匹配,一种是不需要s[i-1]匹配,因为在这之前就已经有子序列出现了。
当用s[i-1]来匹配时,数量为dp[i-1][j-1];
当不用s[i-1]来匹配时,数量为dp[i-1][j];
dp[i][j]=dp[i-1][j-1]+dp[i-1][j]
2.当s[i-1]!=t[j-1]时,只能不用s[i-1]来匹配了,dp[i][j]=dp[i-1][j]
class Solution {
public:
int numDistinct(string s, string t) {
//dp[i][j]:以i-1结尾的s子序列中出现以j-1结尾的t的个数
vector<vector<unsigned int>> dp(s.size()+1,vector<unsigned int>(t.size()+1,0));
//初始化:
for(int i=0;i<=s.size();i++){
dp[i][0]=1;
}
for(int i=1;i<=s.size();i++){
for(int j=1;j<=t.size();j++){
if(s[i-1]==t[j-1]){
//当此时字符相等时,总数量=用s[i-1]匹配+不用s[i-1]匹配
dp[i][j]=dp[i-1][j-1]+dp[i-1][j];
}
else{
dp[i][j]=dp[i-1][j];
}
}
}
return dp[s.size()][t.size()];
}
};