- 要定义一个二维数组来表现出二个字符串中字符包含的关系
- 动规五部曲
dp[i][j]
表示以i - 1
为结尾的字符串s
,和以j - 1
为结尾的字符串t
的个数- 递推公式:
- 当条件:
s[i - 1] == t[j - 1]
为true时dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j]
(这种写法就是递推,当前值由前面值来推算出来) - 当上面条件不成立时,
dp[i][j] = dp[i - 1][j]
因数不相同,所以这部操作相当于把s[i - 1]
这个字符删除一样
typedef unsigned long long ull;
class Solution {
public:
int numDistinct(string s, string t) {
ull len1 = s.size(), len2 = t.size();
if (len1 < len2) {
return 0;
}
std::vector<std::vector<ull>> dp(len1 + 1, std::vector<ull>(len2 + 1, 0));
for (int i = 0; i < len1; ++i) {
dp[i][0] = 1;
}
for (int j = 1; j < len2; ++j) {
dp[0][j] = 0;
}
for (int i = 1; i <= len1; ++i) {
for (int j = 1; j <= len2; ++j) {
if (s[i - 1] == t[j - 1]) {
dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j];
} else {
dp[i][j] = dp[i - 1][j];
}
}
}
return dp[len1][len2];
}
};
- 记录2025年2月3日下午14点18分,对这种从二个或三个前面值推导的原理还不是很清楚
- 汇总