题目
给定字符串 s 和 t ,判断 s 是否为 t 的子序列。
字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"
是"abcde"
的一个子序列,而"aec"
不是)。
示例 1:
输入:s = "abc", t = "ahbgdc" 输出:true
示例 2:
输入:s = "axc", t = "ahbgdc" 输出:false
思路
- 双指针法:使用两个指针分别遍历字符串
s
和t
。- 一个指针
i
用于遍历s
,另一个指针j
用于遍历t
。
- 一个指针
- 字符匹配:
- 从
t
的开头开始,检查每个字符是否与s
的当前字符匹配。 - 如果匹配,则将
s
的指针i
向后移动,表示找到一个字符。 - 不论是否匹配,始终移动
t
的指针j
,继续检查下一个字符。
- 从
- 结束条件:
- 当
i
达到s
的末尾时,说明s
中的所有字符都可以在t
中按顺序找到,返回true
。 - 如果
j
走完了t
但i
还没有到达s
的末尾,说明s
不是t
的子序列,返回false
。
- 当
代码实现
class Solution {
public:
bool isSubsequence(string s, string t) {
int s1=s.size(),s2=t.size();
int i=0,j=0;
while(i<s1&&j<s2){
if(s[i]==t[j]){
i++;
}
j++;
}
return i==s1;
}
};
复杂度分析
-
时间复杂度:
- 在最坏情况下,两个指针分别遍历字符串
s
和t
,每个字符最多被访问一次。 - 时间复杂度为 O(n+m),其中 n是
s
的长度,m是t
的长度。
- 在最坏情况下,两个指针分别遍历字符串
-
空间复杂度:
- 只使用了常量数量的额外空间来存储指针,不需要额外的数组或数据结构。
- 空间复杂度为 O(1)