代码随想录算法训练营第五十五天 | 392. 判断子序列、115. 不同的子序列
- 392. 判断子序列
- 题目
- 解法
- 115. 不同的子序列
- 题目
- 解法
- 感悟
392. 判断子序列
题目
解法
题解链接
- 自己的想法实现
class Solution {
public:bool isSubsequence(string s, string t) {if(s.size() > t.size()) return false;int start_j = 0;for(int i = 0; i < s.size(); i++){for(int j = start_j; j < t.size(); j++){if(s[i] == t[j]){start_j = j+1;if(i != s.size()-1 && j == t.size()-1) return false;break; }if(j == t.size()-1) return false; }}return true;}
};
时间复杂度:O( mn)
空间复杂度:O( 1)
2.
class Solution {
public:bool isSubsequence(string s, string t) {//dp[i][j] 表示以下标i-1为结尾的字符串s,和以下标j-1为结尾的字符串t,相同子序列的长度为dp[i][j]。//f (s[i - 1] == t[j - 1])// t中找到了一个字符在s中也出现了// if (s[i - 1] != t[j - 1])// 相当于t要删除元素,继续匹配vector<vector<int>> dp(s.size()+1, vector<int>(t.size()+1, 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;else dp[i][j] = dp[i][j-1];}}if(dp[s.size()][t.size()] == s.size()) return true;return false;}
};
时间复杂度:O( mn)
空间复杂度:O( mn)
115. 不同的子序列
题目
解法
题解链接
- 动态规划
class Solution {
public:int numDistinct(string s, string t) {if(s.size() < t.size()) return 0;// dp[i][j]:以i-1为结尾的s子序列中出现以j-1为结尾的t的个数为dp[i][j]vector<vector<uint64_t>> dp(s.size()+1, vector<uint64_t>(t.size()+1));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()];}
};
时间复杂度:O(nm )
空间复杂度:O(nm )
感悟
对递归公式含义清晰很重要