方法:双指针
class Solution {
public:
bool isSubsequence(string s, string t) {
int l = 0, r = 0;
while (s[l] && t[r]) {
if (s[l] == t[r]) ++l;
++r;
}
return l == s.size();
}
};
$时间复杂度O(n),空间复杂度O(1)
方法:dp
dp[i][j]状态表示:以j-1为结尾的字符串t和以i-1为结尾的字符串s相同子序列的个数为dp[i][j]
class Solution {
public:
bool isSubsequence(string s, string t) {
int n = s.size(), m = t.size();
vector<vector<int>> dp(n + 1, vector<int> (m + 1, 0));
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) {
if (t[j-1] == s[i-1]) dp[i][j] = dp[i-1][j-1] + 1;
else dp[i][j] = dp[i][j-1];
}
}
return dp[n][m] == n;
}
};
$时间复杂度O(n*m),空间复杂度O(n*m)
方法:dp
dp[i][j]状态表示:以i-1为结尾的字符串s中出现以j-1为结尾的字符串t的个数为dp[i][j]
class Solution {
typedef long long LL;
public:
int numDistinct(string s, string t) {
LL n = s.size(), m = t.size();
vector<vector<uint64_t>> dp(n + 1, vector<uint64_t>(m + 1));
for (int i = 0; i <= n; ++i) dp[i][0] = 1;
for (int i = 1; i <= m; ++i) dp[0][i] = 0;
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= m; ++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[n][m];
}
};
$时间复杂度O(n*m),空间复杂度O(n*m)