LeetCode 392.判断子序列
给定字符串 s 和 t ,判断 s 是否为 t 的子序列。
视频讲解https://www.bilibili.com/video/BV1tv4y1B7ym/?spm_id_from=333.788&vd_source=f98f2942b3c4cafea8907a325fc56a48文章讲解https://programmercarl.com/0392.%E5%88%A4%E6%96%AD%E5%AD%90%E5%BA%8F%E5%88%97.html
注意与LeetCode 1143.最长公共子序列的区别:
1143如果 text1[i - 1] 与 text2[j - 1] 不同,可以:// 动态规划:
class Solution {
public:
bool isSubsequence(string s, string t) {
vector> dp(s.size() + 1, vector(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(n × m)
// 空间复杂度:O(n × m)
// 双指针
class Solution {
public:
bool isSubsequence(string s, string t) {
int count = 0;
for (int i = 0; i < t.size(); ++i) {
if (s[count] == t[i]) {
++count;
}
}
if (count == s.size()) return true;
return false;
}
};
// 时间复杂度:O(m)
// 空间复杂度:O(1)
LeetCode 115.不同的子序列
给定一个字符串 s 和一个字符串 t ,计算在 s 的子序列中 t 出现的个数。
视频讲解https://www.bilibili.com/video/BV1fG4y1m75Q/?spm_id_from=333.788&vd_source=f98f2942b3c4cafea8907a325fc56a48文章讲解https://programmercarl.com/0115.%E4%B8%8D%E5%90%8C%E7%9A%84%E5%AD%90%E5%BA%8F%E5%88%97.html
注意与LeetCode 392.判断子序列的区别:
392维护 s 与 t删末位dp[i][j - 1](因为需要在 t 中找 s)class Solution {
public:
int numDistinct(string s, string t) {
vector> dp(s.size() + 1, vector(t.size() + 1, 0));
// 初始化
for (int i = 0; i <= s.size(); ++i) {
dp[i][0] = 1;
}
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()];
}
};
注:dp数组定义成 int / long long 会溢出;
优化:可将 j <= t.size() 换成 j <= t.size() && j <= i