动态规划——distinct-subsequences

来源:互联网 发布:破壁机有用吗 知乎 编辑:程序博客网 时间:2024/06/04 18:35

题目描述:

给定2个字符串s, t,求t在s中出现的次数。要求可以是不连续的,但是t在s中的顺序必须和t以前的一致。

例如:

S ="rabbbit", T ="rabbit"

Return3.

解法:

递推公式化为递归的代码为:   其中存在大量的重复计算.

public class Solution {    public int numDistinct(String s, String t) {        if(s == null||t == null||s.length()<t.length())            return 0;        return numdistinct(s,t,s.length(),t.length());    }    public int numdistinct(String s,String t,int j,int i)        {        if(i == 0)//只有在s.charAt(j)==t.charAt(1)时,才会递归到这一层,所以要返回1,因为有一个相同的。            return 1;        if(j<i)//j<i时,返回0;            return 0;         //一般情况的递推公式:        if(s.charAt(j-1) != t.charAt(i-1))            return numdistinct(s,t,j-1,i);        else            return numdistinct(s,t,j-1,i)+numdistinct(s,t,j-1,i-1);    }}

DP:

如果S[i]==T[j],那么dp[i][j] = dp[i-1][j-1] + dp[i-1][j];
如果S[i]!=T[i],那么dp[i][j] = dp[i-1][j].

    public int numDistinct(String s, String t) {        if(s == null||t == null||s.length()<t.length())            return 0;        //***temp[i][j]存放s有j个字符,t有i个字符时的t在s中出现的次数;        int [][]temp=new int[t.length()+1][s.length()+1];        //初始化边界赋值,i == 0时为1,j<i时为0;        for(int j=0;j<=s.length();j++)            temp[0][j]=1;        for(int j=0;j<=t.length();j++)            {            for(int i=0;i<=t.length();i++)                {                if(j<i)                    temp[i][j]=0;//j<i即s的长度小于t的长度时.            }        }        //一般递归公式:        for(int j=1;j<=s.length();j++)            {            for(int i=1;i<=t.length();i++)                {                if(s.charAt(j-1)!=t.charAt(i-1))//i,j为字符数,求字符下标时小心越界!                    {                    temp[i][j]=temp[i][j-1];                }else                    {                    temp[i][j]=temp[i-1][j-1]+temp[i][j-1];                }            }        }        return temp[t.length()][s.length()];    }



0 0
原创粉丝点击