LeetCode题目笔记——392. 判断子序列 C++双指针 0ms

文章目录

    • 题目描述
    • 题目难度——简单
    • 方法一:双指针
      • 代码/C++
      • 代码/Python
    • 总结

题目描述

给定字符串 s 和 t ,判断 s 是否为 t 的子序列。

字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。

进阶:

如果有大量输入的 S,称作 S1, S2, … , Sk 其中 k >= 10亿,你需要依次检查它们是否为 T
的子序列。在这种情况下,你会怎样改变代码?

致谢:

特别感谢 @pbrother 添加此问题并且创建所有测试用例。

示例 1:

输入:s = “abc”, t = “ahbgdc” 输出:true
示例 2:

输入:s = “axc”, t = “ahbgdc” 输出:false

提示:

0 <= s.length <= 100 0 <= t.length <= 10^4 两个字符串都只由小写字符组成。

来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/is-subsequence
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

LeetCode题目笔记——392. 判断子序列 C++双指针 0ms_第1张图片
LeetCode题目笔记——392. 判断子序列 C++双指针 0ms_第2张图片

题目难度——简单

方法一:双指针

  注意提示里的t字符串的长度最多比s多了两个数量级。但10的4次方的量级我们也可以遍历,只需要两个指针p1和p2分别指向s和t就行,当每次遍历的时候都移动p2,只有当p1等于p2时才移动p1,这样当最后p1遍历完时说明s的字符已经全部能在t中找到,而如果p1没遍历完,而p2遍历完了,那说明s不是t的子序列,返回false。

代码/C++

class Solution {
public:
    bool isSubsequence(string s, string t) {
        int p1 = 0, p2 = 0;
        int lens = s.size(), lent = t.size();
        while(p1 < lens && p2 < lent){
            if(s[p1] == t[p2]){
                p1++;
            }
            p2++;
        }
        if(p1 == lens){
            return true;
        }
        else if(p2 == lent){
            return false;
        }
        else{
            return false;
        }
    }
};

LeetCode题目笔记——392. 判断子序列 C++双指针 0ms_第3张图片

代码/Python

class Solution:
    def isSubsequence(self, s: str, t: str) -> bool:
        lens, lent = len(s), len(t)
        p1, p2 = 0, 0
        while p1 < lens and p2 < lent:
            if s[p1] == t[p2]:
                p1 += 1
            p2 += 1
        if p1 == lens:
            return True
        else:
            return False

LeetCode题目笔记——392. 判断子序列 C++双指针 0ms_第4张图片

总结

  肯定是要遍历一遍t和s,所以时间是O(N),只用到了两个双指针,所以空间是O(1)。C++代码那里其实最后的判断都不用判断p2是否等于lent了,直接一个else就可以解决。

你可能感兴趣的:(LeetCode,leetcode,算法,c++,python)