题目链接:leetcode,判断子序列
这道题目在leetcode的分类为简单,这道题自然也不难。思路非常明确,1、从子序列中使用遍历(即双循环)的方式在父序列中进行查找,将在父序列中找到的元素的索引存储在空列表中;
2、对于空列表前后的元素进行大小核对,防止出现子序列顺序与父序列顺序不符合的情况;
函数的主体部分主要使用循环与条件语句组成,之间相互的嵌套关系非常复杂,原谅我知识浅薄,编程能力低下,弄了三个多小时都没有弄出来,有大神可以尝试一下,在这里我就不贴出代码了。
当我在双循环里挣扎的时候,慢慢也发现了问题的所在。由于规定了“子序列就是由父序列删除若干元素后组成”,所以当子序列搜索到父序列中的一个元素后,下一个子序列元素就不用从父序列的头部开始搜索,直接从搜索到的父序列中的元素开始搜索就好了。
同时,题目要求的返回值为(True/False),所以我们没有必要去记录相应父序列的元素索引,当检测到有对应元素时直接开始从下一个父序列的元素开始搜索下一位子序列元素就好了。(这里说的可能有点绕)
这里我们就联想到了C/C++中的指针了,然而Python没有指针,我们就用列表的索引来代替就好了,代码如下:
class Solution:
def isSubsequence(self, s, t):
i = 0
j = 0
if len(s)>=len(t) and s!=t:
return False
while i < len(s):
if s[i] == t[j]:
i += 1
if j == len(t)-1 and i!=len(s):
return False
j += 1
return True
上述代码中存在一个条件语句,只是为了防止某些特殊情况发生,和整体思路无关。
最终程序的运行速度为40ms,超过约80%的Python用户,内存使用超越100%的用户。
今天的题目思路可能略微有些跳跃,如果有看的不太懂的欢迎在评论区留言,随时解答~
爱你们~