您的位置:首页 > 产品设计 > UI/UE

动态规划——distinct-subsequences t在s中出现的次数

2016-05-21 20:20 423 查看
题目描述:

给定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()];
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: