题目描述:
解题思路:
一看题,最直接的思路就是:使用双指针模拟。
用指针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