题意:
给两个字符串A,B,求B串作为A串的子序列在A串中出现的个数。(子序列不是子串)
如S = "rabbbit" T = "rabbit" 返回3
思路:动规
dp[i][j]表示:b的前j个字符在a的前i个字符中出现的次数。
如果a[i] == b[j]则 dp[i][j] = dp[i-1][j] + dp[i-1][j-1]
如果a[i] != b[j]则 dp[i][j] = dp[i-1][j]
代码:
int numDistinct(string S, string T) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
vector<vector<int>> f(S.size()+1, vector<int>(T.size()+1));
for (int i = 0; i <= S.size(); i++) f[i][0] = 0;
for (int i = 0; i <= T.size(); i++) f[0][i] = 0;
for (int i = 1; i <= S.size(); i++) {
if (S[i-1] == T[0]) f[i][1] = f[i-1][1]+1;
else f[i][1] = f[i-1][1];
}
for (int i = 2; i <= S.size(); i++) {
for (int j = 2; j <= T.size(); j++) {
if (S[i-1] == T[j-1]) f[i][j] = f[i-1][j-1]+f[i-1][j];
else f[i][j] = f[i-1][j];
}
}
return f[S.size()][T.size()];
}