剑指offer 专项突破版 97、子序列的数目

题目链接

思路
  • 设f(i,j)是t的前j个字符在s前i个字符中出现的次数
  • 如果s[i]=t[i] 那么在选择子串的时候,可以用s[i]去匹配t[i] (此时f(i,j)=f(i-1,j-1)),也可以不用s[i]去匹配t[i] (此时f(i,j)=f(i-1,j))
  • 如果s[i]!=t[i] 那么s[i]并不能去匹配t[i] 此时f(i,j)=f(i-1,j)
  • 所以状态转移方程为
    f(i,j) = f(i-1,j-1) + f(i-1,j) 相等
    f(i,j) =f(i-1,j) 不等
  • 注意边界条件
    • f(-1,-1)代表空串在空串的出现次数,是1
    • f(-1,j)代表t的前j个字符串在s的前-1个字符串中出现的次数 应该是0
    • f(i,-1)代表t的前-1个字符串(空串)在s的前i个字符串中出现的次数 应该是1
class Solution {
    public int numDistinct(String s, String t) {
		if(t.length() == 0)
        	return 1;
        if(s.length() < t.length())
        	return 0;
        
        int[][] dp = new int[2][t.length()+1];
        dp[0][0] = 1;

        for(int i = 1 ; i <= s.length() ; i++){
            dp[i%2][0] = 1;
            for(int j = 1 ; j <= t.length() ; j++){
            	dp[i%2][j] = dp[(i-1)%2][j] + (s.charAt(i-1) == t.charAt(j-1) ? dp[(i-1)%2][j-1] : 0);
            }
        }
        return dp[s.length()%2][t.length()];
    }
}

/*

f(i,j) = f(i-1,j-1) + f(i-1,j) 相等
		 f(i-1,j)			   不等

*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值