首页 > 编程语言 >day58 动态规划part15 代码随想录算法训练营 392. 判断子序列

day58 动态规划part15 代码随想录算法训练营 392. 判断子序列

时间:2024-03-08 12:57:10浏览次数:27  
标签:字符 遍历 迭代 复杂度 随想录 part15 day58 序列 指针

题目:392. 判断子序列

我的感悟:

理解难点:

听课笔记:

我的代码:

通过截图:

代码易错点:

老师代码:

扩展写法-双指针:

class Solution:
    def isSubsequence(self, s: str, t: str) -> bool:
        # 初始化两个指针,分别指向s和t的第一个字符
        i, j = 0, 0
        
        # 遍历t,直到j到达t的末尾
        while j < len(t):
            # 如果当前t的字符与s的第i个字符相同
            if i < len(s) and t[j] == s[i]:
                # 匹配成功,移动s的指针到下一个字符
                i += 1
            
            # 移动t的指针到下一个字符
            j += 1
        
        # 如果s的指针i到达了s的末尾,说明s是t的子序列
        return i == len(s)

AI分析:

在这个代码中,我们使用两个指针ij分别遍历字符串st。我们从t的第一个字符开始遍历,每当找到一个与s当前字符匹配的字符时,就将s的指针向前移动一位。如果s的指针能够遍历完整个s,那么s就是t的子序列。

这种方法的效率比之前的方法要高,因为它避免了在每次迭代中都遍历整个t。在最坏的情况下,我们只需要遍历st中的每个字符一次。因此,时间复杂度是线性的,即O(m + n)。

扩展写法-迭代器:

class Solution:
    def isSubsequence(self, s: str, t: str) -> bool:
    	# 判断 s 是否为 t 的子序列。
    	b = iter(t)  # 迭代器
    	return all(((i in b) for i in s ))

AI辅助分析:

时间复杂度是O(m * n),其中m是子序列字符串s的长度,n是目标字符串t的长度。

  1. 创建迭代器b = iter(t)的时间复杂度是O(1),因为它仅仅是创建一个迭代器,不涉及遍历t

  2. all(((i in b) for i in s))这部分是一个列表推导式,它遍历字符串s中的每个字符,并检查该字符是否在迭代器b代表的字符串t中。对于s中的每个字符i(i in b)这个操作的时间复杂度是O(n),其中n是t的长度。这是因为在最坏的情况下,可能需要遍历整个t来确定字符i是否存在。

  3. 由于列表推导式会为s中的每个字符执行上述操作,所以总的时间复杂度是O(m * n),其中m是s的长度,n是t的长度。

资料:

标签:字符,遍历,迭代,复杂度,随想录,part15,day58,序列,指针
From: https://www.cnblogs.com/liqi175/p/18060753

相关文章