今天的每日一题是Leetcode115. 不同的子序列,题意如下:
字符串匹配的题我们可以想到用动态规划,两个字符串匹配的题可以用二维动态规划。我们定义dp[i][j]为:第一个字符串从0到i这个长度中第二个字符串从0到j这个长度的字符串出现的次数。 首先dp[i][0]的值肯定都为1,因为任意串都有一个空的子序列。
这里参考宫水三叶大佬的讲解:
c++参考代码如下:
class Solution {
public:
int numDistinct(string s, string t) {
long long n=s.size(),m=t.size();
vector<vector<long long>> dp(n+1,vector<long long> (m+1,0));
for(int i=0;i<=n;i++)
dp[i][0]=1;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(s[i]==t[j])
dp[i+1][j+1]=dp[i][j]+dp[i][j+1];
else
dp[i+1][j+1]=dp[i][j+1];
}
}
return dp[n][m];
}
};
时间复杂度:O(NM)。*
参考资料
·宫水三叶《详解「字符串匹配」的通用思路和技巧》