字符串中某子序列的个数 Distinct Subsequences

142 篇文章 20 订阅
51 篇文章 0 订阅

问题:Given a string S and a string T, count the number of distinct subsequences of T in S.要求出S中所有的为T的子序列。

思路:

一、直观想法:递归试探。指数级复杂度。

class Solution {
public:
    int numDistinct(string S, string T) {
	    if(T == "")
	    {
		    if(S == "")
			    return 1;
		    else
			    return 0;
	    }
	    return match(S, T);
    }

    int match(string S, string T)
    {
	    if(T == "")
		    return 1;
	    if(S == "")
		    return 0;
	    int count = 0;
	    count += match(S.substr(1), T);
	    if(S[0] == T[0])
	    	count += match(S.substr(1), T.substr(1));
	    return count;
    }
};


二、字符串神马的,最爱用动态规划,研究问题和子问题的关系。

设状态量H[i][j],表示母串S前i个字符中含有T前j个字符的子序列的个数。

初始状态H[0][0] = 1, H[i][0] = 1, H[0][j] = 0

递推关系:对于H[i][j],

如果S[i-1] != T[j-1],那么H[i][j] = H[i-1][j]

如果S[i-1] == T[j-1],那么H[i][j] = H[i-1][j] + H[i-1][j-1]


借助DP的空间缓存之后,空间复杂度变为N^2。

class Solution {
public:
    int numDistinct(string S, string T) {
        int m = S.length();
        int n = T.length();
        if(n == 0)
            return 1;
        if(m == 0)
            return 0;
        
        int H[m+1][n+1];
        H[0][0] = 1;
        for(int i=1;i<=m;i++)
            H[i][0] = 1;
        for(int i=1;i<=n;i++)
            H[0][i] = 0;
        
        for(int i=1;i<=m;i++)
            for(int j=1;j<=n;j++)
                H[i][j] = H[i-1][j] + ((S[i-1] == T[j-1])?H[i-1][j-1]:0);
        return H[m][n];
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值