You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

技术求助:查找指定数组中的重复序列

找出数组中的最长重复连续子序列

给定数组[3, 2, 16, 16, 15, 1, 2, 16, 16, 16, 15, 1, 2],要找到其中重复出现的最长连续子序列,预期结果为[16, 16, 15, 1, 2],可以通过以下思路实现:

核心思路

从最长的可能子序列长度开始遍历(最长不超过数组长度的一半,因为需要至少重复两次),对每个长度,检查所有可能的连续子序列,一旦发现某个子序列已经出现过,它就是我们要找的最长重复子序列。

代码实现

arr = [3, 2, 16, 16, 15, 1, 2, 16, 16, 16, 15, 1, 2]

# 从最长可能的子序列长度往下遍历
for seq_len in range(len(arr) // 2, 0, -1):
    seen_subsequences = set()
    # 遍历所有可能的起始索引
    for start_idx in range(len(arr) - seq_len + 1):
        # 转换为元组才能存入集合(列表不可哈希)
        current_seq = tuple(arr[start_idx:start_idx + seq_len])
        if current_seq in seen_subsequences:
            print(list(current_seq))
            exit()
        seen_subsequences.add(current_seq)

代码解释

  1. 外层循环控制子序列的长度,从数组长度的一半开始递减,确保我们优先找到最长的重复子序列。
  2. 内层循环遍历所有可能的起始位置,提取当前长度的连续子序列。
  3. 使用集合存储已经见过的子序列,利用集合的O(1)查找特性快速判断子序列是否重复。
  4. 一旦找到重复的子序列,立即输出并终止程序,因为我们是从最长长度开始找的,第一个找到的就是最长的。

内容的提问来源于stack exchange,提问作者André Fabião

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 04:05:15