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)