社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
思路:一般情况有关字符串子序列或者匹配的问题,都可以用动态规划的方法。
我们通过观察上面的二维数组可以发现,当更新到dp[i][j]时,dp[i][j] >= dp[i][j - 1] 总是成立,再进一步观察发现,当 T[i - 1] == S[j - 1] 时,dp[i][j] = dp[i][j - 1] + dp[i - 1][j - 1],若不等, dp[i][j] = dp[i][j - 1],所以,综合以上,递推式为:
dp[i][j] = dp[i][j - 1] + (T[i - 1] == S[j - 1] ? dp[i - 1][j - 1] : 0)
二维数组dp需要用long,而不能用int型,避免结果超出int型的范围。
class Solution {
public:
int numDistinct(string s, string t) {
long dp[t.size() + 1][s.size() + 1];
for (int i = 0; i <= s.size(); ++i) dp[0][i] = 1;
for (int i = 1; i <= t.size(); ++i) dp[i][0] = 0;
for (int i = 1; i <= t.size(); ++i) {
for (int j = 1; j <= s.size(); ++j) {
dp[i][j] = dp[i][j - 1] + (t[i - 1] == s[j - 1] ? dp[i - 1][j - 1] : 0);
}
}
return dp[t.size()][s.size()];
}
};
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!