LeetCode 算法题库【392】——判断子序列

判断子序列

题目描述:

timu

解题思路:
  • 第一种:顺序查找。当我看到这个题,我的想法是,能不能将要找的字符串s的每个字符,在长字符串t中依次来查找,因为一定要按照原字符串s的顺序来,所以每当我们找到一个字符,就把这个字符之前的所有字符去掉(包括这个字符),然后再继续往下查找,以此类推。这样就变得简单了,下面实现这个思路,我们可以通过迭代的方式依次判断每个字符是不是在t中,这里s[i]t中的第一次出现的位置会被返回,然后我们用index找出这个字符的位置,通过字符串切片的方式来将之前字符去掉。接下来就是如果整个长字符串中都没有所需字符,就返回False,如果循环成功结束,就说明存在子序列,那么就返回True
  • 时间复杂度:O(N)
class Solution:
    def isSubsequence(self, s: str, t: str) -> bool:
        for i in range(len(s)):   # for i in s:
            if s[i] in t:   # if i in t:
                t = t[t.index(s[i]) + 1:]   # t = t[t.index(i)+1:]
            else:
                return False
        return True

1

  • 第二种:双指针迭代。这道题,我们可以用到双指针的方法,也是特别的简单而且容易理解。首先先定义双指针s_pointert_pointer都为0,并且分别用于指代字符串st上的字符,然后在两个指针分别小于相应字符串长度的前提下进行迭代遍历,首先判断s中的第一个字符和t中的字符从头开始比较是否相等,如果相等说明这个M+N字符在t中存在,然后就判断s的第二个字符,所以这个条件下s指针要加1,每次判断完,无论是存在不存在,t指针都要加1,避免重复判断。最后遍历结束之后,如果s_pointer等于s字符串数量,说明找到了子序列,反之,则不存在子序列,返回False
  • 时间复杂度:O(M+N)
class Solution:
    def isSubsequence(self, s: str, t: str) -> bool:
        s_pointer, t_pointer = 0, 0  # 定义双指针
        while s_pointer < len(s) and t_pointer < len(t):
            if s[s_pointer] == t[t_pointer]:
                s_pointer += 1
            t_pointer += 1
        return s_pointer == len(s)

2

  • 第三种:系统函数find()方法。这个方法运行速度是挺快的,我们很巧妙的用到pythonfind()方法。这个函数是会返回第一个对应元素位置,如果没有找到对应元素就会返回-1,如果找到了元素,那么就用切片方法将这个位置及之前元素移除,再继续查找。
  • 时间复杂度:O(N)
class Solution:
    def isSubsequence(self, s: str, t: str) -> bool:
        if not s:
            return True
        for i in s:
            point = t.find(i)
            if point == -1:
                return False
            t = t[point+1:]
        return True

3

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值