//动态规划
//题意是用删除字符的方法,字符串s1变成字符串s2,一共有多少种变换方法
//f[i][j]表示有字符串i变成字符串j的总变换方法
//当s1[i]=s2[j]时,f[i][j]=f[i][j]+f[i-1][j]意思是当
//s1[i]=s2[j]时,当前的字母可以保留也可以抛弃
//所以f[i][j]等于保留此字母使得变换方法加上不保此字母的变换方法
//当s1[i]!=s2[j]时,f[i][j]=f[i-1][j] 不使用(删除s1[i])的变换方法
//由于任意字符变成空字符只有一种变换方法
//f[0][0]=1,f[i][0]=1
class Solution {
public:
int numDistinct(string &s, string &t) {
int m=s.size();
int n=t.size();
if(m==0 || n==0) return 0;
vector<vector<int>>f(m+1,vector<int>(n+1,0));
if(m<n)
return 0;
f[0][0]=1;
for(int i=0;i<=m;i++)
f[i][0]=1;
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
if(s[i-1]==t[j-1])//当前字符是i-1
{
f[i][j]=f[i-1][j-1]+f[i-1][j];
}
else
{
f[i][j]=f[i-1][j];
}
}
}
return f[m][n];
}
};
distinct subsequences
最新推荐文章于 2021-03-20 14:23:47 发布