给定一个字符串 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
思路:先统计出T中每个字符在S出现的位置,然后从后向前地推。
class Solution {
public:
static const int NN=1000;
int numDistinct(string s, string t) {
int N=t.length();
int M=s.length();
vector<int> num[NN];
vector<int> dp[NN];
for(int i=0; i<N; i++) {
char c=t[i];
for(int j=0; j<M; j++) {
if(s[j]==c)
num[i].push_back(j);
}
}
if(N>=1) {
for(int i=0; i<num[N-1].size(); i++)
dp[N-1].push_back(1); //最后一个都标记为1
}
for(int i=N-2; i>=0; i--) {
for(int j=0; j<num[i].size(); j++) {
int t=num[i][j];
dp[i].push_back(0);// 相当于DP[I][J]=0;计数器初始为0
for(int k=0; k<num[i+1].size(); k++)
if(num[i+1][k]>t)
dp[i][j]=dp[i+1][k]+dp[i][j];
//cout<<dp[i][j];
}
//cout<<endl;
}
int sum=0;
for(int i=0; i<dp[0].size(); i++)
sum+=dp[0][i];
return sum;
}
};