通过这题学习了指针和单指针算法
题目
给定字符串 s 和 t ,判断 s 是否为 t 的子序列。
字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"
是"abcde"
的一个子序列,而"aec"
不是)。
思路
刚开始没思路,想用最简单的两个遍历,搜索,把记录存下来做,后来想了想可以用更简单的解法,写完之后才知道是单指针算法,正好学习了一下。还有一点就是当子序列已经在原始字符串中找到了之后就可以停止寻找,进一步优化代码。
单指针算法
是指在处理两个序列(或两个集合)相关的操作时,使用一个指针来逐步遍历其中一个序列,并根据某种条件来决定是否移动该指针。在你的问题中,单指针算法 是通过遍历 t
,并同时检查 s
中的字符是否能按照顺序依次匹配到。
单指针算法的特点:
- 单一指针:只有一个指针跟踪匹配的进度(如
s
中的字符)。 - 顺序遍历:遍历一个序列的每个元素,同时依据某种条件(如匹配字符)来移动指针。
- 效率高:在问题中,单指针算法可以通过一轮遍历实现匹配,且时间复杂度通常为 O(n)。
代码
class Solution:
def isSubsequence(self, s: str, t: str) -> bool:
a=list(s)
b=list(t)
c=0
for i in range(len(b)):
if c == len(a): # 如果已经匹配完所有 a 中的字符,提前返回 True
return True
if a[c]==b[i]:
c+=1
return c == len(a)