392.判断子序列
思路:判断子序列的问题,其实与最大公共子序列的问题是一样的,所以基本上写出来是一样的,但是今天又犯了一个错误,对于非连续子序列,不仅要在相等的时候进行更新,而且不等的时候也要更新!
class Solution {
public:bool isSubsequence(string s, string t) {vector<vector<int>> dp(s.size()+1,vector<int>(t.size()+1,0));int result=0;for(int i=1;i<=s.size();i++){for(int j=1;j<=t.size();j++){if(s[i-1]==t[j-1]){dp[i][j]=dp[i-1][j-1]+1;cout<<"dp:"<<dp[i][j]<<endl;} else{dp[i][j]=dp[i][j-1];}if(dp[i][j]>result)result=dp[i][j];}}cout<<result<<endl;if(result==s.size())return true;return false;}
};
115.不同的子序列
思路:首先分析题意,我们要t中找到s的最多次数,而且可以非连续,如果是连续的话,就是KMP算法了。非连续的问题,就意味着我们要t进行删除一位,那么这个删除的过程是怎么样的呢?这个就要讨论递推公式了,遍历到t和s的最后一个位置,是相等的,那么此时dp[i][j]=dp[i-1][j-1],但是如果此时最后一个位置不相等呢?即不用t的最后一个元素去匹配,故dp[i][j]=dp[i-1][j],故其是分为了两种情况!另外一种情况就是不相等了,那么只能用前一个位置了。初始化的问题,当t字符串为空的时候,s字符串有东西的话,都不可能匹配上,则为0,但是t字符串不为空,s字符串为空的时候,则为1,如果t和s的字符串都为空,那么这个时候必然为1!
class Solution {
public:int numDistinct(string s, string t) {vector<vector<uint64_t>> dp(s.size()+1,vector<uint64_t>(t.size()+1,0));for(int i=0;i<=s.size();i++)dp[i][0]=1;for(int j=1;j<=t.size();j++)dp[0][j]=0;for(int i=1;i<=s.size();i++){for(int j=1;j<=t.size();j++){if(s[i-1]==t[j-1]){dp[i][j]=dp[i-1][j-1]+dp[i-1][j];}else{dp[i][j]=dp[i-1][j];}}}return dp[s.size()][t.size()];}
};