题目描述
给定两个字符串S和T,返回S子序列等于T的不同子序列个数有多少个?
字符串的子序列是由原来的字符串删除一些字符(也可以不删除)在不改变相对位置的情况下的剩余字符(例如,"ACE"is a subsequence of"ABCDE"但是"AEC"不是)
例如:
S=“nowcccoder”, T = “nowccoder”
返回3
思路
- 动态规划,从最小母串、最小子串开始
- 用二维数组存储可能性
class Solution {
public:
/**
*
* @param S string字符串
* @param T string字符串
* @return int整型
*/
int numDistinct(string S, string T) {
// write code here
int n = T.length(), m = S.length();
vector<vector<int>> dp(n+1, vector<int>(m+1, 0));
// 当子串为0时,任意母串,都只有一种子序列
for(int j = 0; j < m + 1; j++)
dp[0][j] = 1;
// 动态规划,从头开始累计不同长度的母串,对应子串的个数
for(int i = 1; i < n + 1; i++){
for(int j = 1; j < m + 1; j++){
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];
}
}
}
return dp[n][m];
}
};
错因
- 没有注意,在比较S和T对应位置字符的时候下标要减一