题目连接:Leetcode 115 Distinct Subsequences
解题思路:dp[i][j]表示s[0]~s[j]匹配前i个字符有多少种方式(s[j]一定匹配t[i]),dp[i][j] = sum(dp[i-1][k]) 其中k<j,如果s[j] != t[i] 的话,dp[i][j] = 0。最后可以省略一层dp状态。
class Solution {
public:
int numDistinct(string s, string t) {
int m = s.size(), n = t.size();
int* dp = new int[m];
for (int i = 0; i < m; i++) dp[i] = 0;
int p = 1;
for (int k = 0; k < n; k++) {
for (int i = 0; i < m; i++) {
int tmp = s[i] == t[k] ? p : 0;
p += dp[i];
dp[i] = tmp;
}
p = 0;
}
int ans = 0;
for (int i = 0; i < m; i++) ans += dp[i];
delete[] dp;
return ans;
}
};