这题首先要开一个二维数组来保存值,其中数组列数为匹配字符串的长度+1,而数组行数为子字符串的长度+1。根据题意也能推导出当匹配字符串与子字符串的某个字符相同时递推公式为dp[i][j]=dp[i][j-1]+dp[i-1][j-1],否则为dp[i][j]=dp[i][j-1]。留意到当扫描匹配字符串或者子字符串的第一个字符无法使用这个递推公式,因此需要将二维数组的第一行设为1方便之后地推,之后就是常规操作:利用两层for循环,套用递推公式完成二维数组,最后返回右下角的值即为最终答案。
class Solution {
public:
int numDistinct(string s, string t) {
int m = s.size(), n = t.size();
if (m == 0 || n == 0)
return 0;
vector<vector<int>> dp(n + 1, vector<int>(m + 1, 0));
for (int i = 0; i <= m; i++)
dp[0][i] = 1;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
if (t[i - 1] == s[j - 1])
dp[i][j] = dp[i][j - 1] + dp[i - 1][j - 1];
else
dp[i][j] = dp[i][j - 1];
return dp[n][m];
}
};