每日一练之distinct-subsequences

distinct-subsequences

OJ地址:distinct-subsequences
在这里插入图片描述
【举个栗子】
在这里插入图片描述
"rabbbit" —> {rabb, it} {ra, bbit} {rab, bit}
一共三种

  • 【问题】S中与T相同的子序列的个数
  • 【子问题】S的子串中与T相同的子序列的个数
  • 【状态】
    F(i, j):S的前 i 个字符构成的子串中与T的前 j 个字符相同的子序列的个数
  1. 如果 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)
  2. 如果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];
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值