题目描述:
给定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()];
}