携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第9天,点击查看活动详情
1.描述
给定字符串 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)