问题定义

给定两个字符串S1,S2S_1 , S_2S1​,S2​,找到一个最长的字符串S3S_3S3​,要求S3S_3S3​即是S1S_1S1​的子串,又是S2S_2S2​的子串
什么是子串:在字符串"12345"中,"123"是子串,“135”不是子串(是子序列)

解决方案

动态规划法

设立二维矩阵max_tail_len[i][j]表示S1S_1S1​以i为结尾,S2S_2S2​以j为结尾的最长公共子序列长度,矩阵满足如下关系:
max_tail_len[i][j]={max_tail_len[i−1][j−1]+1S1[i]=S2[j]0S1[i]!=S2[j]max\_tail\_len[i][j]=\left\{\begin{array}{l}max\_tail\_len\lbrack i-1\rbrack\lbrack j-1\rbrack+1\;\;\;S_1\lbrack i\rbrack=S_2\lbrack j\rbrack\\0\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;S_1\lbrack i\rbrack\;!=S_2\lbrack j\rbrack\end{array}\right.max_tail_len[i][j]={max_tail_len[i−1][j−1]+1S1​[i]=S2​[j]0S1​[i]!=S2​[j]​
根据此关系即从低索引到高索引更新出矩阵的值,代码如下(代码中的res表示公式中的max_tail_len[i][j]):

    res = [[0]*len(str2) for _ in range(len(str1))]for i in range(len(str1)):for j in range(len(str2)):if str1[i]==str2[j]:if i>0 and j>0:res[i][j]=1+res[i-1][j-1]else:res[i][j]=1

之后在迭代期间保存最大的长度和字符串即可,整个代码如下:

def max_sub_str(str1,str2):"""最长公共字串动态规划时间复杂度O(n^2):param str1::param str2::return: 最大长度,最大长度子串列表"""res = [[0]*len(str2) for _ in range(len(str1))]max_len=0max_str=[]for i in range(len(str1)):for j in range(len(str2)):if str1[i]==str2[j]:if i>0 and j>0:res[i][j]=1+res[i-1][j-1]else:res[i][j]=1# 记录最大值if res[i][j]>max_len:max_len=res[i][j]max_str=[str1[i-max_len+1:i+1]]elif res[i][j]==max_len:max_str.append(str1[i-max_len:i])return max_len,max_str

复杂度

时间复杂度:O(n2)O(n^2)O(n2)
空间复杂度:O(n2)O(n^2)O(n2)

最长公共子串(Python)相关推荐

  1. java实现最长连续子序列_最长公共子序列/最长公共子串 Python/Java实现

    关注我的微信公众号:后端技术漫谈 不定期推送关于后端开发.爬虫.算法题.数据结构方面的原创技术文章,以及生活中的逸闻趣事. 我目前是一名后端开发工程师.主要关注后端开发,数据安全,网络爬虫,物联网,边 ...

  2. Algorithm:C++/python语言实现之求旋转数组最小值、求零子数组、求最长公共子序列和最长公共子串、求LCS与字符串编辑距离

    Algorithm:C++/python语言实现之求旋转数组最小值.求零子数组.求最长公共子序列和最长公共子串.求LCS与字符串编辑距离 目录 一.求旋转数组最小值 1.分析问题 2.解决思路 二.求 ...

  3. 用Python计算最长公共子序列和最长公共子串

    如何用Python计算最长公共子序列和最长公共子串 1. 什么是最长公共子序列?什么是最长公共子串? 1.1. 最长公共子序列(Longest-Common-Subsequences,LCS) 最长公 ...

  4. python实现编辑距离,最长公共子序列,最长公共子串

    python实现编辑距离 python实现最大公共子序列 python实现最长公共子串

  5. 【236】Python求列表最长字符串及lambda和最长公共子串

    ♣ 题目部分(原文见公众号:python宝) python宝: https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=MzU5Nj ...

  6. LCS/最长公共子序列/最长公共子串 实现 Python/Java

    参考 http://blog.csdn.net/u012102306/article/details/53184446 http://blog.csdn.net/hrn1216/article/det ...

  7. Python最长公共子串

    Python最长公共子串 方法一 最简单最容易想到的方法,去数组第一个元素为最长公共前缀,如果是,就return,如果不是就减去最后一个单词.只到找到位置. class Solution:def lo ...

  8. [Python]获取2个字符串的最长公共子串

    原创文章,欢迎转载.转载请注明:转载自 祥的博客 原文链接:https://blog.csdn.net/humanking7/article/details/84645055 文章目录 @[toc] ...

  9. python -- 最长公共子串

    #! /usr/bin/env python3 # -*- coding: utf-8 -*-# 对于最长公共子串问题,答案为网格中最大的数字--它可能并不位于最后的单元格中def findlonge ...

最新文章

  1. Java中多线程并发处理方式
  2. Unity 动画属性
  3. 母版中menu控件上传后出现脚本错误
  4. 数据存储方式_视频监控系统的数据存储方式的概念及应用
  5. 【转】C#获取当前日期时间(转)
  6. Kubernetes!我要用这样的姿势拥抱你|坐标深圳
  7. 关联——Apriori算法详解
  8. 天梯赛座位分布-一点都不垃圾的模拟题,代码长度超过100行的都是傻子
  9. 比python更精简的语言,两行代码抓取淘宝/京东平台的商品数据--Uibot
  10. python 白噪声检验 结果-时间序列 平稳性检验 白噪声 峰度 偏度
  11. 数电6_1——时序逻辑电路概述(很久整理的,没有下文)
  12. Delphi ActionList详解
  13. STM32 ST-LINK Utility介绍、下载、安装、使用方法
  14. 【计算机视觉】:(3)全景图像拼接
  15. 【ASE+python】实现将poscar格式文件批量转换为xsd格式文件
  16. 啧啧啧。。。加壳失败
  17. AI: Python 的Matplotlib 绘图算法库 介绍。
  18. 某站卖的第八区分发源码/APP分发系统平台源码
  19. 国密算法java源码_国密算法SM2证书制作
  20. 从入门到精通!安卓手机如何安装java软件

热门文章

  1. SQL Server查询优化方法
  2. OpenV2X Beihai版本线上分享会
  3. Scrapy:运行爬虫程序的方式
  4. unity打包webgl PC端和移动端使用
  5. 电子科技大学随机过程和电子科技大学矩阵理论矩阵理论总结
  6. JS - 日期 - 使用setDate(0)获取上个月的最大一天
  7. MIUI 12 安装谷歌套件 解决升级miui后无法使用谷歌套件的问题 适用于升级到android11后无法使用三件套 点击登录没反应的情况
  8. Redis 性能优化 —— 内存碎片
  9. 控制算法-PID算法总结-从公式原理到参数整定解析(附C源码)
  10. codecombat极客战记--山峰--士兵的祸害