首页 > 编程问答 >在整数列表中查找最长的重复非重叠整数序列

在整数列表中查找最长的重复非重叠整数序列

时间:2024-07-26 12:34:23浏览次数:7  
标签:python longest-substring

我需要一个有效的代码来查找整数列表中最长的非重叠整数序列。

我到处寻找,甚至询问了 GPT4o,但没有找到解决这个相当简单但有趣的问题的好方法。

如果有人可以帮助我改进它并检查它的准确性,我真的很感激!

提前致谢。

这是我到目前为止所得到的。这是非常低效和缓慢的,但它似乎工作正常。

import math
from collections import Counter

seq = [1, 2, 3, 1, 2, 6, 1, 2, 3]
#seq = [0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 2, 3]
#seq = [-2, 2, -2, 2, -2, 2, -2, 2, -2, 2, -2, 2, -2, 2, -2, 2]

def count_patterns(lst, sublist):
    count = 0
    idx = 0
    for i in range(len(lst) - len(sublist) + 1):
        if lst[idx:idx + len(sublist)] == sublist:
            count += 1
            idx += len(sublist)
        else:
          idx += 1
    return count

all_seqs = Counter()

max_pat_len = math.ceil(len(seq) / 2)

num_iter = 0

for i in range(len(seq)):
  for j in range(i+1, len(seq)+1):
    if j-i <= max_pat_len:
      all_seqs[tuple(seq[i:j])] += 1
      num_iter += 1

max_count = 0
max_len = 0

for val, count in all_seqs.items():

  if max_len < len(val):
    max_count = max(2, count)

  if count > 1:
    max_len = max(max_len, len(val))
    pval = val

max_pats = []

for val, count in all_seqs.items():
  if count == max_count and len(val) == max_len:
    max_pats.append(val)

for pat in max_pats:
  if count_patterns(seq, list(pat)) > 1:
    print(len(pat))
    print(pat)

你可以使用更有效的算法来解决这个问题。下面是一些使用动态规划的 Python 代码,以及解释算法工作原理的步骤:

def longest_repeating_non_overlapping_subsequence(seq):
    """
    在整数列表中查找最长的重复非重叠整数序列。

    Args:
        seq: 整数列表。

    Returns:
        一个元组,其中包含最长重复非重叠序列的长度和列表
        (如果找不到此类序列,则返回 (0, []))。
    """

    n = len(seq)
    # 初始化一个表来存储最长重复子序列的长度
    # seq[i:j] 和 seq[j:]
    dp = [[0 for _ in range(n + 1)] for _ in range(n + 1)]

    # 初始化最长重复子序列的长度
    max_len = 0
    end_index = 0

    # 遍历所有可能的子序列的开始位置
    for i in range(1, n + 1):
        # 遍历所有可能的子序列的结束位置
        for j in range(i + 1, n + 1):
            # 如果子序列相同且不重叠
            if seq[i - 1] == seq[j - 1] and j - i > dp[i - 1][j]:
                # 更新最长重复子序列的长度
                dp[i][j] = dp[i - 1][j] + 1
                # 更新最长重复子序列的长度及其结束位置
                if dp[i][j] > max_len:
                    max_len = dp[i][j]
                    end_index = j

    # 构建最长重复子序列
    longest_seq = seq[end_index - max_len:end_index] if max_len > 0 else []

    return max_len, longest_seq


# 示例用法
seq = [1, 2, 3, 1, 2, 6, 1, 2, 3]
max_len, longest_seq = longest_repeating_non_overlapping_subsequence(seq)
print("最长重复子序列的长度:", max_len)
print("最长重复子序列:", longest_seq)

解释:

  1. 动态规划表: 该算法使用二维列表( dp )来存储计算的中间结果。 dp[i][j] 存储在 seq[0:i] seq[j:n] 中找到的最长重复非重叠子序列的长度,其中 n 是序列的长度。

  2. 基本情况: 该表的初始化方式是,如果 i j 为 0,则所有条目都为 0。这是因为如果其中一个子序列为空,则最长重复子序列的长度为 0。

  3. 迭代计算: 该算法迭代地填充 dp 表,从左上角到右下角。在每个单元格 dp[i][j] 处,该算法会检查 seq[i-1] 是否等于 seq[j-1] 以及子序列是否不重叠 ( j-i > dp[i-1][j] )。如果是,则将 dp[i][j] 设置为 dp[i-1][j] + 1 。否则,将 dp[i][j] 设置为 0。

  4. 最长序列的长度: dp 表中的最大值表示最长重复非重叠子序列的长度。

  5. 回溯(可选): 要找到实际的子序列,你可以从 dp 表中存储最大值的单元格开始回溯,并根据用于填充该单元格的值重建该序列。

时间复杂度: 该算法的时间复杂度为 O(n^2),其中 n 是序列的长度。这是因为我们必须填充大小为 n x n 的 dp 表。

空间复杂度: 该算法的空间复杂度也为 O(n^2),这是因为我们必须存储大小为 n x n 的 dp 表。但是,如果我们只需要最长序列的长度,则可以将空间复杂度降低到 O(n),因为我们只需要存储 dp 表的上一行。

标签:python,longest-substring
From: 78796055

相关文章

  • Python 教程(三):字符串特性大全
    目录专栏列表前言1.字符串基础2.字符串方法字符串查询字符串修改字符串切片3.字符串格式化旧式格式化(`%`操作符)`str.format()`方法f-string(Python3.6+)4.字符串编码5.Unicode和ASCII6.正则表达式7.字符串比较8.字符串连接9.字符串不可变性10.字符串的内......
  • python+flask计算机毕业设计新冠肺炎疫情人员统计及打卡系统(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景自新冠肺炎疫情爆发以来,全球公共卫生体系面临前所未有的挑战。疫情防控工作的高效开展,依赖于对人员流动、健康状况及疫情数据的精准掌握与......
  • python+flask计算机毕业设计基于智能匹配的体育场馆预约系统App(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着全民健身意识的日益增强,体育场馆作为民众参与体育活动的重要场所,其利用率与便捷性成为了社会关注的焦点。然而,传统的体育场馆预约方式......
  • Vonage 语音 API - 使用 python 出现错误
    我正在尝试使用vonage语音api模拟语音通话。我正在尝试使用python来做到这一点。我创建了一个.env文件并更新了应用程序id和私钥值的值,而不是路径(不确定从哪里获取它)。这是下面编写的代码:#!/usr/bin/envpython3importosfromos.pathimportjoin,dirname......
  • 数据清洗与预处理:使用 Python Pandas 库
    数据清洗与预处理:使用PythonPandas库1.简介数据清洗与预处理是数据科学和机器学习中必不可少的步骤。它涉及识别和处理原始数据中的错误、不一致和缺失值,以确保数据的质量和可靠性。Python的Pandas库提供了强大的工具,简化了数据清洗和预处理的过程。2.数据加载与探索......
  • 【Python】成功解决:`FileExistsError: [Errno 17] File exists: ‘xxx’`
    【Python】成功解决:FileExistsError:[Errno17]Fileexists:‘xxx’在Python编程中,处理文件和目录是常见的任务之一。然而,当我们尝试执行某些文件操作,如创建新文件或目录时,如果目标文件或目录已经存在,就可能会遇到FileExistsError异常。这个错误通常伴随着消息[Errno1......
  • (三)Python基本数据类型
    Python的基本数据类型包括整数类型、浮点数类型和复数类型。下面分别介绍这些数据类型以及数值运算操作符和数值运算函数。整数类型(int):整数类型表示没有小数部分的数字,可以是正数、负数或零。例如:a=5b=-3c=02.浮点数类型(float):浮点数类型表示有小数部分的数字,可以......
  • 【Python自动化办公】用Pandas库自动化操作Excel表格,从读取、写入到数据处理和分析
    文末免费赠送精品编程资料~~前言Python的第三方Pandas库是数据处理和分析中的利器,其强大的功能可以帮助我们轻松地对Excel表格进行自动化操作。接下来,我们将介绍九个用Pandas库操作Excel的编程例子,并且每个例子都会涉及不同的知识点,确保全面掌握这个主题。1.读取和写入E......
  • 总结24个Python接单赚钱平台与详细教程,兼职月入5000+
    如果说当下什么编程语言最靠谱或者比较适合搞副业?答案肯定100%是:Python。python是所有语法中最简单易上手的语言,不需要特别的的英语词汇量,逻辑思维也不需要很差就能上手。而且学会了之后就能编写代码爬取各种数据,制作各种图表,提升工作效率。而且还能利用业余时间接点私活......
  • python安装第三方库的国内镜像
    直接:pipconfigsetglobal.index-urlhttps://pypi.doubanio.com/simple设置了全局的第三方库的下载文件镜像请求网址。安装第三方库:pipinstallscrapy--scrapy第三方库名称 pip从国内镜像安装的命令使用中国大陆地区的Python包镜像服务时,可以通过修改p......