/*动态规划法。
设dp[i][j]表示S[0...i]中T[0...j]出现的次数,则有
1)若S[i]!=S[j],dp[i][j] = dp[i-1][j];
2)若S[i]==S[j],dp[i][j] = dp[i-1][j] + dp[i-1][j-1]。*/
class Solution {
public:
int numDistinct(string s, string t) {
if(s.empty()) return 0;
vector<int> dp(t.size(), 0);
dp[0] = (s[0] == t[0] ? 1 : 0);
for(int i = 1; i < s.size(); ++i){
for(int j = t.size()-1; j >= 0; --j){
if(j == 0 && s[i] == t[j]){
dp[j] += 1;
continue;
}
if(s[i] == t[j]) dp[j] = dp[j] + dp[j-1];
}
}
return dp[t.size()-1];
}
};LeetCode之Distinct Subsequences
最新推荐文章于 2024-10-01 18:52:56 发布
本文介绍了一种使用动态规划解决字符串中特定子序列出现次数的方法。通过定义状态dp[i][j]来表示源字符串S[0...i]中目标子序列T[0...j]出现的次数,并给出了具体的实现过程。
2万+

被折叠的 条评论
为什么被折叠?



