状态转移方程: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; } };