Python解决最长子串问题

2023-11-05

设有两个字符串abaabba和bbbabaa,问它们的最长子串是什么?这个问题的一个应用就是比较两个病毒的基因,从而给出两者的相似度。这里我们用递归方法解决这个难题。

输入参数显然是两个字符串s1s2。递归边界是s1s2中至少有一个是空字符串[1],此时它们的最大子串就是空字符串。递归假设是只要s1s2中少了一个字符,则程序总能计算出它们剩余部分的最长子串。

递归推导时可以把s1的第一个字符c拎出来单独考虑。如果最长子串中不含有c,则可以递归地求s1的剩余部分与s2的最长子串r1。否则可以针对s2中出现的每一个c,求其后的字符串与s1的剩余部分的最长头子串[2],设为r2。最后比较len(r1)和len(r2)+1,保留大的那个即可。代码如下:

最长子串问题

def longest_substring(s1, s2, f1=0, f2=0):
    # 为了避免代价高的字符串复制操作,使用f1和f2指明字符串起始位置
    if f1 >= len(s1) or f2 >= len(s2):
        return ''

    c = s1[f1]
    r1 = longest_substring(s1, s2, f1+1, f2)

    start = f2
    while True:
        pos = s2.find(c, start) # 从start处开始找字符c
        if pos < 0:
            break
        r2 = longest_head(s1, s2, f1+1, pos+1)
        if len(r2) + 1 > len(r1):  # 保留最长的子串
            r1 = c + r2
        start += len(r2) + 1
    return r1

def longest_head(s1, s2, f1, f2):
    # 获取s1和s2分别从f1和f2开始的最长头子串
    f1_start = f1
    while f1 < len(s1) and f2 < len(s2) and s1[f1] == s2[f2]:
        f1 += 1
        f2 += 1
    return s1[f1_start: f1]


if __name__ == '__main__':
    print(longest_substring('abaabba', 'bbbabaa'))

程序运行的结果是:abaa。


[1] 即不含有任何字符的字符串,比如''。空字符串的长度为0。

[2] 头子串是指从第一个字符开始的子串

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python解决最长子串问题 的相关文章

随机推荐

  • nn.Embedding

    在PyTorch中 针对词向量有一个专门的层nn Embedding 用来实现词与词向量的映射 nn Embedding具有一个权重 weight 形状是 vocab size embedding dim Embedding层的输入形状是b
  • TensorFlow手写数字识别

    1 保存为图片 使用mnist数据集 from tensorflow examples tutorials mnist import input data mnist input data read data sets MNIST data
  • 阿里云ecs服务器如何设置实现访问互联网

    概述 阿里云上新开了一台ecs服务器 想访问外网下载或安装一些源依赖或者应用 我们如何设置安全组实现访问外网 首先我们先要了解rfc1918 什么是rfc1918 本段转载自 What is RFC 1918 Definition from
  • python_字典列表嵌套的排序问题

    上一篇我们聊到python 字典和列表嵌套用法 这次我们聊聊字典和列表嵌套中的排序问题 这个在python基础中不会提到 但实际经常运用 面试中也喜欢问 我们娓娓道来 在说组合排序之前 先来看看排序有哪些函数 排序函数 使用排序有两个可用方
  • recyclerlistview

    RecyclerView的基本用法 和百分比布局类似 RecyclerView也是新增布局 因此需要在项目的build gradle添加相应的依赖库才行 打开app build gradle文件 在dependencies闭包中添加如下内容
  • 单源最短路径问题c++实现(贪心算法)

    文章目录 1 认真审阅题目 明确题目的已知条件和求解的目标 2 问题建模 3 算法设计 4 编码实现 5 测试数据 6 程序运行结果 1 认真审阅题目 明确题目的已知条件和求解的目标 给定一个有向带权图 G V E 其中每条边的权是一个非负
  • 实战wxPython:041 - 高级控件之树状控件TreeCtrl

    树形控件wx TreeCtrl将信息表示为层次结构 其中的项可以展开以显示更多的项 一 树状控件wx TreeCtrl wx TreeCtrl继承自wx WithImages类 因此提供了将图像与控件项关联的函数 通过wx WithImag
  • 链式队列的基本操作(c语言实现)

    队列类型定义 队列的操作与栈的操作类似 不同的是 删除是在队头进行 队列分类 顺序队列 与栈相似 数组 无非就是多了一个指针 简单的讲讲顺序队列 元素入队 队尾指针往后加一 元素出队 队头指针往后加一 现在我们设想一下 前面有一个数组 我们
  • 制作AR换装游戏(上篇AR识图)#1024程序员节#

    EasyAR制作AR游戏的方法我之前的文章讲过 只是当时用的旧版的 链接放上 Unity和Easy AR制作一个AR的APP alayeshi的专栏 CSDN博客这个不是什么正规的项目 就是觉得AR好玩 研究了一下 很早之前就玩过了 现在再
  • python的open函数使用

    在python中使用open函数对文件进行处理 1 open python打开文件使用open 函数 返回一个指向文件的指针 该函数常用以下三个参数 1 1 参数1 目标文件的路径 名字 最好使用r 路径 这种原始字符串写法 防止有转义字符
  • ajax返回request,ajaxRequest解析

    刚开始学习ajax 听网上的一下大佬说 ajax要与springMVC使用 让我对这个ajax有恐惧 不过慢慢学习了ajx后其实可以不用springMVC的 说回主题 ajaxREquest是一个模板 我们只要在调用时传了正确的参数即可调用
  • C++:CMake重要指令【cmake_minimum_required、project,set、STREQUAL ....】

    一 CMake重要指令 1 重要指令 1 1 cmake minimum required 指定CMake的最小版本要求 语法 cmake minimum required VERSION versionNumber FATAL ERROR
  • 高级加密标准AES的工作模式(ECB、CBC、CFB、OFB)

    最近在重构之前写的HTTP代理 这个代理是由代理客户端和代理服务端组成的 二者之前使用SSL保证通信内容不会受到中间人 MITM 攻击 而新的实现打算移除SSL 因为SSL握手的开销过大 尤其是客户端与服务端之间隔了个太平洋 另一方面本月中
  • 区间列表的交集

    LeetCode 986 区间列表的交集 给定两个由一些 闭区间 组成的列表 每个区间列表都是成对不相交的 并且已经排序 返回这两个区间列表的交集 形式上 闭区间 a b 其中 a lt b 表示实数 x 的集合 而 a lt x lt b
  • nginx实战

    1 nginx简介 1 1 什么是nginx Nginx 是高性能的 HTTP 和反向代理的web服务器 处理高并发能力是十分强大的 能经受高负 载的考验 有报告表明能支持高达 50 000 个并发连接数 其特点是占有内存少 并发能力强 事
  • 【面试】前端常见面试题总结

    1 什么是mvvm mvc 模型 MVVM是Model View ViewModel的简写 即模型 视图 视图模型 模型 指的是后端传递的数据 视图 指的是所看到的页面 视图模型 mvvm模式的核心 它是连接view和model的桥梁 总结
  • 矩阵置零(原地变换)

    将矩阵中0元素的行和列都变成0 如果正常做非常好做 只要遍历一遍记录0的位置 然后第二遍遍历将该行和列变成0即可 但这样需要用到空间复杂度为O mn 时间O m n 第二种在找0 的过程中就把矩阵中的行和列都变成一个设置的值 不是0 第二遍
  • 阿里云稳坐视频云实力第一,市场份额超二、三名之总和

    根据中国领先的大数据公司易观发布的 2019年中国视频云行业专题分析 报告 阿里云在资源技术 商业创新与市场份额三个分析维度全面领先 成为中国最具实力的视频云厂商 报告显示 2018年中国视频云市场规模已达91 3亿元 随着直播和短视频应用
  • Android Wi-Fi开关控制

    Android Wi Fi开关控制 在Android应用程序中 控制设备的Wi Fi开关是常见的任务 本文将详细介绍如何在Android应用程序中实现Wi Fi的开关控制 并提供相应的源代码示例 添加权限 首先 在应用程序的AndroidM
  • Python解决最长子串问题

    设有两个字符串abaabba和bbbabaa 问它们的最长子串是什么 这个问题的一个应用就是比较两个病毒的基因 从而给出两者的相似度 这里我们用递归方法解决这个难题 输入参数显然是两个字符串s1和s2 递归边界是s1和s2中至少有一个是空字