leetcode: Distinct Subsequences

本文介绍了一种使用动态规划解决字符串S到T所有可能子序列个数的方法。通过构建二维数组记录从S的前i个字符到T的前j个字符的转换路径数量,实现了高效计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意要求我们找到S到T的所有可能的字串个数。   由于T是通过S消减字符形成,那么利用动态规划tmp{i][j]代表S的前i个字符到T的前j个字符可能的个数。   初始tmp[i][0]为1,即S到空串的转化只有一个途径,其余全为0。

当S[i-1]==T[j-1]时,要么保留S[i-1],要么舍弃;当不相同时,只能舍弃。


public class Solution {
    public int numDistinct(String S, String T) {
        if( S==null || T==null)
        {
            return 0;
        }
        int l1 = S.length();
        int l2 = T.length();
        if( l1 < l2 )
        {
            return 0;
        }
        int [][]tmp = new int[l1+1][l2+1];
        tmp[0][0] =1;
        for( int i=1;i<=l1;i++ )
        {
            tmp[i][0] = 1;
        }
        for( int i=1;i<=l1;i++ )
        {
            for( int j=1;j<=l2;j++ )
            {
                if(S.charAt(i-1)==T.charAt(j-1))
                {
                    tmp[i][j] = tmp[i-1][j-1]+tmp[i-1][j];
                }
                else
                {
                    tmp[i][j] = tmp[i-1][j];
                }
            }
        }
        return tmp[l1][l2];
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值