如何正确实现判断整数列表是否为另一列表子序列的is_subsequence函数?
解决子序列判断函数的问题
我来帮你搞定这个is_subsequence函数的实现!先看看你当前代码里的几个问题:
- 你用的
list2 in list1是在判断整个list2是不是list1的连续子列表,但子序列允许元素间有间隔,这个判断逻辑完全不对; - 循环里的缩进有问题,代码会直接报错;
- 没有处理子序列最核心的要求——元素必须和原列表顺序一致,你当前的逻辑根本没覆盖这点。
正确的实现思路:双指针法
判断子序列最经典且高效的方法就是用双指针:一个指针遍历原列表list1,另一个指针跟踪list2的匹配进度。只要list1里的元素和list2当前指针位置的元素匹配,就移动list2的指针;如果list2的指针走完所有元素,说明匹配成功;如果list1遍历完还没匹配完list2,就说明匹配失败。
完整代码实现
def is_subsequence(list1, list2): # 特殊情况:空列表是任何列表的子序列 if not list2: return True # 初始化list2的匹配指针 match_index = 0 len_list2 = len(list2) # 遍历list1的每一个元素 for num in list1: # 如果当前元素和list2待匹配的元素一致 if num == list2[match_index]: match_index += 1 # 一旦match_index走到list2末尾,说明全部匹配完成 if match_index == len_list2: return True # 遍历完list1都没匹配完list2,返回False return False
测试几个典型场景
- 正常匹配:
is_subsequence([1,2,3,4], [2,4])→ 返回True - 顺序错误:
is_subsequence([1,2,3,4], [4,2])→ 返回False - 完全匹配:
is_subsequence([5,1,3], [5,1,3])→ 返回True - 空列表:
is_subsequence([1,2], [])→ 返回True - 匹配失败:
is_subsequence([1,2], [1,3])→ 返回False
这个逻辑完美覆盖了子序列的核心要求:元素顺序一致,允许间隔,而且时间复杂度是O(n)(n是list1的长度),效率很高。
内容的提问来源于stack exchange,提问作者Royalking
相关产品推荐
相关产品推荐

