【刷题打卡】392. 判断子序列

96 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第9天,点击查看活动详情

1.描述

392. 判断子序列

给定字符串 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
  • 两个字符串都只由小写字符组成。

2.分析

这里我把t称为主串,s称为模式串,这里判断是否是子串,不止要判断s中所有字符是否在t中,还要判断s中字符的相对位置,直觉告诉我,这里要用递归。

递归思路:我们假设s中每一个字符在主串t中的位置为x,x可能为多个,比如s="abc",t="ahabgdc",s中第一个字符为a,a在t中的位置有两个,分别是0与2,所以判断下一个字符,就必须从下标1开始判断b是否在t中,以及从下标3开始判断b是否在t中,再下一个字符依次类推。

3.AC代码

class Solution:
    def recursionFind(self, s, t, index, start):
        # 如果index大于等于模式串的长度,则说明已经把模式串查找完了
        if index >= len(s):
            return True
        # 如果主串中查找的下标大于等于主串的长度,说明没查找到模式串中字符
        if start >= len(t):
            return False
        c = s[index]
        tmp = start
        # 结果集合
        result = []
        while tmp != -1:
            # 如果结果集合中有true,则直接返回即可
            if True in result:
                return True
            tmp = t.find(c, tmp)
            # 如果查找到指定字符
            if tmp != -1:
                tmp += 1
                # 去查找下一个模式串中的字符
                result.append(self.recursionFind(s, t, index+1, tmp))

        if True in result:
            return True
        else:
            return False

    def isSubsequence(self, s: str, t: str) -> bool:
        if not str:
            return True
        index = 0
        start = 0
        if t.find(s) != -1:
            return True
        return self.recursionFind(s, t, index, start)