题目链接:115. 不同的子序列
题解
n=len(s),m=len(t)
- 定义
dp[i][j]:字符串(s[i]~s[n-1]) 的子字符串中与字符串t[j]~t[m-1]匹配的个数。 - 初始化
dp[i][m]:字符串t从0开始,所以t[m]为空,任意字符串的子字符串都能与空串匹配,即dp[i][m]=1
dp[n][i]:同理,空串不与非空字符串t匹配,所以dp[n][i]=0 - 状态转移
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] - 答案:dp[0][0]
代码
leetcode评测机真的离谱,函数返回值为int型,但是你开的数组必须用longlong才行,不然就RE…
class Solution {
public:
long long dp[1010][1010];
int numDistinct(string s, string t) {
memset(dp,0,sizeof(dp));
int n=s.length(),m=t.length();
for(int i=0;i<=n;i++) dp[i][m]=1;
for(int j=0;j<m;j++) dp[n][j]=0;
for(int i=n-1;i>=0;i--)
for(int j=m-1;j>=0;j--)
{
if(s[i]==t[j]) dp[i][j]=dp[i+1][j]+dp[i+1][j+1];
else dp[i][j]=dp[i+1][j];
}
return dp[0][0];
}
};