1.暴力法超时
class Solution {
int count=0;
string s1;
void dfs(string s,string& t,int i)
{
if(i==t.size()&&i<=s.size()){ count++;return;}
if(i==s.size()||i==t.size()) return;//到任意末端返回
if(s[i]!=t[i])
{
s1=s.substr(0,i)+s.substr(i+1);
dfs(s1,t,i);
}
else{
dfs(s,t,i+1);//相等搜索下一个
s1=s.substr(0,i)+s.substr(i+1);//相等 去掉当前字符 在从此处搜索
dfs(s1,t,i);
}
return;
}
public:
int numDistinct(string s, string t) {
dfs(s,t,0);
return count;
}
};
2.动态规划
从后往前遍历
dp[i][j]代表 s[i]到s[size-1]的字符串中有子串为t[j]到t[size-1]的个数
s[i]==s[j] 时 dp[i][j]=dp[i+1][j+1]+dp[i+1][j]
s[i]!=s[j]时 dp[i][j]=dp[i+1][j]
当t为空串时候 则个数为1 0=<i<=s.size()
dp[i][t.size()]=1;
class Solution {
long dp[1050][1050];
//dp[i][j]代表 s[i]到s[size-1]的字符串中有子串为t[j]到t[size-1]的个数
public:
int numDistinct(string s, string t) {
memset(dp,0,sizeof(dp));
for(int i=0;i<=s.size();i++)
dp[i][t.size()]=1; //t为空字符串
for(int i=s.size()-1;i>=0;i--)
{
for(int j=t.size()-1;j>=0;j--)
{
if(s[i]==t[j])
dp[i][j]=dp[i+1][j+1]+dp[i+1][j];
else dp[i][j]=dp[i+1][j];
}
}
return dp[0][0];
}
};