给出字符串S和字符串T,计算S的不同的子序列中T出现的个数。
子序列字符串是原始字符串通过删除一些(或零个)产生的一个新的字符串,并且对剩下的字符的相对位置没有影响。(比如,“ACE”是“ABCDE”的子序列字符串,而“AEC”不是)。
样例
给出S = "rabbbit", T = "rabbit"
返回 3
class Solution {
public:
/**
* @param S, T: Two string.
* @return: Count the number of distinct subsequences
*/
int numDistinct(string &S, string &T) {
// write your code here
int tLength = T.size();
int sLength = S.size();
vector<vector<int>>dp(tLength+1,vector<int>(sLength+1,0)) ;
for(int i = 0;i < sLength+1;i++) {
dp[0][i] = 1;
}
for(int i = 1; i<tLength+1;i++){
for(int j=1; j<sLength+1;j++) {
//之前在这里写成S[j-1] == T[i-1]导致花了很多时间,动态规划的状态方程和操作字符安串的下标一般是不对称的!!!
if(S[j-1] == T[i-1]) {
dp[i][j] = dp[i][j-1] + dp[i-1][j-1];
} else {
dp[i][j] = dp[i][j-1];
}
// dp[i][j] = ((S[j] == T[i])?(dp[i-1][j-1]):0) + dp[i][j-1];
}
}
return dp[tLength][sLength];
}
};
参考LeetCode
解释
dp[i][j] = dp[i][j-1] + dp[i-1][j-1];
dp[i][j] 为字符串S(0,i-1)到T(0,j-1)的S的子序列中T出现的个数
当S[j-1] == T[i-1]
- dp[i][j-1]表示前面符合条件的子串
- dp[i-1][j-1]表示加上字符s[i-1]后符合条件个数
动态规划的状态方程和操作字符安串的下标一般是不对称的!!!
网友评论