贪心算法——LeetCode刷题——【392. 判断子序列】

题目描述:

在这里插入图片描述

解题思路:

一看题,最直接的思路就是:使用双指针模拟。
用指针i指向子串s,用指针j指向主串t。如果指针i和j扫描到的字符相同,指针i和j都移动。如果扫描到的字符不相同,只移动主串的指针j(在主串之后的字符中寻找和子串指针i当前所指字符相同的字符)。
整个循环结束之后,如果子串指针移动次数和子串长度一致,那么就证明s是t的子序列。否则证明不是。

哪里用到贪心算法了呢?

举个例子:
子串:abc
主串:afgbajhbc

贪心策略:遇到一个子串字符,主串中有好几个相同字符可以匹配时,每次优先选择靠前的主串字符去匹配子串。

在这里插入图片描述

为什么优先前面的呢?

因为我们贪心的假设:相同的子串字符,用靠前的主串字符匹配,后面还有一系列字符呢,匹配整个子串成功的概率要比使用靠后的主串字符高!

代码和注释:

class Solution:
    def isSubsequence(self, s: str, t: str) -> bool:
        n = len(s)
        m = len(t)
        i = 0
        j = 0
        # 双指针移动
        while i < n and j < m:
            if s[i] == t[j]:
                i += 1
            j += 1
        
        # 子串指针移动次数等于子串长度,则匹配成功
        if i == n:
            return True
        # 匹配失败
        else:
            return False

运行结果:

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值