distinct-subsequences
OJ地址:distinct-subsequences
【举个栗子】
"rabbbit" —> {rabb, it} {ra, bbit} {rab, bit}
一共三种
- 【问题】S中与T相同的子序列的个数
- 【子问题】S的子串中与T相同的子序列的个数
- 【状态】
F(i, j):S的前 i 个字符构成的子串中与T的前 j 个字符相同的子序列的个数
- 如果 S[i] == T[j]:有两种情况
【1】如果使用第 i 个字符,那么第 i 个字符必定是作为子序列的最后一个字符,那么就要S从前 i-1 个字符中去掉一个字符与 T 的前 j-1 个字符匹配:F(i, j) = F(i-1, j-1)
【2】如果不使用第 i 个字符,那么状态不变:F(i, j) = F(i-1, j)
- 如果S[i] != T[j],那么第 i 个字符不起作用:
F(i, j) = F(i-1, j)
- 【初始化】引入空串进行初始化
F(i,0) = 1
—> S的子串与空串相同的个数,只有空串与空串相同- 【返回结构】
F(m,n)
int numDistinct(string S, string T) {
// write code here
int n1 = S.length();
int n2 = T.length();
if(n2 == 0)
return 0;
vector<vector<int> > dp(n1 + 1, vector<int>(n2 + 1, 0));
//初始化
for(int i = 0; i <= n1; i++)
dp[i][0] = 1;
for(int i = 1; i <= n1; i++)
{
for(int j = 1; j <= n2; j++)
{
if(S[i - 1] == T[j - 1])
{
dp[i][j] = dp[i-1][j] + dp[i-1][j-1];
}
else
dp[i][j] = dp[i-1][j];
}
}
return dp[n1][n2];
}