一、题目描述
给定字符串 s 和 t ,判断 s 是否为 t 的子序列。
字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。
进阶:
如果有大量输入的 S,称作 S1, S2, … , Sk 其中 k >= 10亿,你需要依次检查它们是否为 T 的子序列。在这种情况下,你会怎样改变代码?
二、测试用例
示例 1:
输入:s = "abc", t = "ahbgdc"
输出:true
示例 2:
输入:s = "axc", t = "ahbgdc"
输出:false
提示:
0 <= s.length <= 100
0 <= t.length <= 10^4
两个字符串都只由小写字符组成。
三、解题思路
- 基本思路:
双指针,按序匹配字符串 s ,直到遍历完字符串 s 或者 t 为止。 - 具体思路:
- 预处理:定义指针 i 和 j ,用于遍历字符串 s 和 t ,初始化都为 0 ;
- 匹配:匹配两个指针所指的字符,相等则字符串 s 后移,而字符串 t 每次匹配都后移,直到遍历完字符串 s 或者字符串 t 结束。此时,如果是遍历完字符串 s ,则表示 s 是 t 的子序列,返回 true ,否则,字符串 t 都遍历完了,而字符串 s 还没有遍历完,则表示 s 不是 t 的子序列,返回 false;
四、参考代码
时间复杂度:
O
(
n
+
m
)
\Omicron(n+m)
O(n+m)
空间复杂度:
O
(
1
)
\Omicron(1)
O(1)
class Solution {
public:
bool isSubsequence(string s, string t) {
int n=s.length(),m=t.length();
int i=0,j=0;
while(i<n&&j<m){
if(s[i]==t[j]){
i++;
}
j++;
}
if(i==n){
return true;
}
else{
return false;
}
}
};