打卡第二十六天(Task26)----判断子序列

Leetcode刻意练习----贪心算法2

题目

给定字符串 s 和 t ,判断 s 是否为 t 的子序列。
你可以认为 s 和 t 中仅包含英文小写字母。字符串 t 可能会很长(长度 ~= 500,000),而 s 是个短字符串(长度 <=100)。
字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。

示例 1

s = "abc", t = "ahbgdc"
返回 true.

示例 2

s = "axc", t = "ahbgdc"
返回 false.

思路

想办法按位置顺序找出s中的每个元素是否都在t中,一定要注意的是顺序问题

题解一(双指针)

class Solution:
    def isSubsequence(self, s: str, t: str) -> bool:
        a = 0
        b = 0
        while a < len(s) and b < len(t):
            if s[a] == t[b]:
                a += 1
            b += 1
        return a == len(s)

在这里插入图片描述

题解二(find函数)

看了一下题解,学到了这个find()函数的用法:
find() 方法检测字符串中是否包含子字符串 str ,如果指定 beg(开始) 和 end(结束) 范围,则检查是否包含在指定范围内,如果包含子字符串返回开始的索引值,否则返回-1。beg和end的初始值都默认为0,因此可以用a是否等于-1来判断s中的第i个元素是否在t中,并且可以从每次判断的下一位进行下次判断。

class Solution:
    def isSubsequence(self, s: str, t: str) -> bool:
        if len(s) == 0:
            return True
        a = -1
        for i in s:
            a = t.find(i, a + 1)
            if a == -1:
                return False
        return True

在这里插入图片描述

题解三(迭代器)

这个方法看起来还挺有趣的,就摘录了下来,它的原理是:
iter()返回的是一个可迭代的对象(迭代器),而迭代器对象又具备__next__()内置方法,因此for循环实质是循环调用__next__()方法,并且会处理最后一次__next__()的异常。在一次循环中它是单向的。

通俗点说就是,all函数是所有的元素都是True才返回True,除此都是False。然后t=iter(t)得到的迭代器的作用是使得执行c in t时,每次调用一个t里的元素对比,直到对比成功跳出来或者不在t里,然后第二个c对比的时候就是接着第一次的位置继续对比t

class Solution:
    def isSubsequence(self, s: str, t: str) -> bool:
        t = iter(t)
        return all(i in t for i in s)

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值