LeetCode-115. Distinct Subsequences【动归】

题目描述

Given a string S and a string T, count the number of distinct subsequences of S which equals T.
A subsequence of a string is a new string which is formed from the original string by deleting some (can be none) of the characters without disturbing the relative positions of the remaining characters. (ie, “ACE” is a subsequence of “ABCDE” while “AEC” is not).
Here is an example:
S = “rabbbit”, T = “rabbit”
Return 3

解题思路

字符串S和字符串T,求解字符串S的子序列(可以删除某些位置的元素,但不可移动元素的位置)中与字符串T相等的个数。
1. 利用递归的方式求解,超时。
2. 利用动态规划的方式求解,首先初始化数组result[t.length()+1][s.length()+1],result[i][j]代表S[0:j]的子序列与字符串T[0:i]相等的个数,同时将数组的第一行全部初始化为1,这是因为T为空的时候可以通过将S中的所有位置的字符都删掉构成的序列与T相等。
转移方程为:
如果s.charAt(j)==t.charAt(i):result[i+1][j+1]=result[i][j]+result[i+1][j+1];如果i和j位置的字符相等,可以有两种选择,将S中j位置的元素删掉result[i+1][j]或者保留S中j位置的元素result[i][j].否则,result[i+1][j+1]=result[i+1][j],只能删掉j位置的字符。

代码

  1. 递归求解
class Solution {
    int count = 0;
    public int numDistinct(String s, String t) {
        if(s == null || t == null || s.length() < t.length())
            return 0;
         numCore(s,t,0,0);
         return count;
    }
    private void numCore(String s,String t,int sp,int st){
        if(st >= t.length()){
             count++;
            return;
        }          
        if(s.length()-sp >= t.length()-st){
            if(s.charAt(sp) == t.charAt(st)){
                numCore(s,t,sp+1,st+1);
            }
            numCore(s,t,sp+1,st);
        }
    }
}
  1. 动归
class Solution {
    public int numDistinct(String s, String t) {
        if(s == null || t == null || s.length() < t.length())
            return 0;
        int[][] result = new int[t.length()+1][s.length()+1];
        for(int i=0;i<=s.length();i++){
            result[0][i] = 1;
        }
        for(int i=0;i<t.length();i++){
            for(int j=0;j<s.length();j++){
                if(s.charAt(j) == t.charAt(i)){
                    result[i+1][j+1] = result[i][j] + result[i+1][j];
                }else
                    result[i+1][j+1] = result[i+1][j];
            }
        }
        return result[t.length()][s.length()];
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值