题目链接
https://leetcode.cn/problems/is-subsequence/?envType=study-plan-v2&envId=top-interview-150
题解思路
- 首先如果
s的长度大于t的长度,那么s肯定不是t的子序列 - 如果
s的长度等于t的长度,那么s==t的情况下s才是t的子序列 - 如果
s的长度小于t的长度,那么我们需要一个下标i来依次遍历字符串s中的字符,另一个下标j来依次便利t中的字符,对于s[i]我们需要找到一个s[j]和它相等,对于s[i + 1],我们需要找到t[j']和s[i + 1]相等,其中j' > j,以此类推。简单来说,我们需要按顺序遍历字符串s,然后在字符串t中找到和s中的字符相等的字符,这样才能证明s是t的子序列。
时间复杂度O(n+m)O(n + m)O(n+m)
空间复杂度O(1)O(1)O(1)
附上代码:
class Solution {
public:
bool isSubsequence(string s, string t) {
int n = s.length();
int m = t.length();
// s是t的子序列的前提条件是s的长度比t短
if (n > m) {
return false;
}
// n <= m
// 时间复杂度O(n + m)
int j = 0;
for (int i = 0; i < n; ++i) {
bool match = false;
for (;j < m; ++j) {
if (s[i] == t[j]) {
match = true;
++j;
break;
}
}
if (!match) {
return false;
}
}
return true;
}
};
该博客主要介绍了LeetCode第392题的解决方案,通过双指针法判断一个字符串是否为另一个字符串的子序列。博主详细解释了思路,指出当子序列长度大于目标字符串长度时不可能为子序列,当长度相等时需完全匹配,否则需要使用两个指针在目标字符串中寻找子序列的对应字符。最后,博主提供了实现该算法的代码,时间复杂度为O(n+m),空间复杂度为O(1)。
7万+

被折叠的 条评论
为什么被折叠?



