状态转移方程:dp[i][j] = sum(dp[i-1][0],...,dp[i-1][j-1]);
还可以继续优化,可以用空间换时间,减少求解dp[i][j]的查询数量,
贴出代码,请大佬给出更优的算法,以此共勉!
class Solution {
public:
int numDistinct(string S, string T) {
int ans = 0, n = S.size(), m = T.size();
vector<vector<int> > dp(m, vector<int>(n, 0));
// S是主串,T是匹配串
// 初始化,匹配串的第一个字符在主串中出现的位置
for(int j = 0; j < n; j++) {
if(T[0] == S[j]) dp[0][j] = 1;
}
//
for(int i = 1; i < m; i++) {
for(int j = 0; j < n; j++) {
if(T[i] == S[j]) {
// 状态转移方程,当前的结果数为上一行所有遇到的情况的加和
// 即: dp[i][j] = sum(dp[i-1][0],...,dp[i-1][j-1]);
for(int leftJ = j-1; leftJ >= 0; leftJ--) {
dp[i][j] += dp[i-1][leftJ];
}
}
}
}
// 匹配总数是最后一个匹配字符在主串中分别出现的位置的总数加和
for(int j = 0; j < n; j++)
ans += dp[m-1][j];
return ans;
}
};
京公网安备 11010502036488号