介绍

子串和子序列的意思不一样,如下图所示,子序列不要求连续,只需要在给定序列中出现过,并且相对顺序一致。而子串需要连续。

图片来自动态规划 最长公共子序列 过程图解

最长公共子串:
同时出现在两个字符串中的最长子串

实现

使用动态规划的方法,思想如下:

对于两个字符串xxx与yyy

dp[i,j]dp[i, j]dp[i,j]表示公共子串的最大长度,该公共子串以xxx的第iii个字符结尾并且以yyy的第jjj个字符结尾

完成所有dpdpdp的计算后,选择最大的dp值,即为两个字符串xxx与yyy的最长公共子串长度;

往前回溯,即可得到最长公共子串

从上面的思想可知,如果xxx的第iii个字符结与yyy的第jjj个字符不相等,则dp[i,j]=0dp[i, j]=0dp[i,j]=0,因为公共子串不可能以两个不同的字符结尾。

递推公式如下:

dp[i,j]={0若 i=0或 j=0dp[i−1,j−1]+1若 i,j≥0,xi−1=yj−10若 i,j≥0,xi−1≠yj−1dp[i, j]= \begin{cases}0 & \text { 若 } i=0 \text { 或 } j=0 \\ dp[i-1, j-1]+1 & \text { 若 } i, j\geq0, x_{i-1}=y_{j-1} \\ 0& \text { 若 } i, j\geq0, x_{i-1} \neq y_{j-1}\end{cases} dp[i,j]=⎩⎪⎨⎪⎧​0dp[i−1,j−1]+10​ 若 i=0 或 j=0 若 i,j≥0,xi−1​=yj−1​ 若 i,j≥0,xi−1​​=yj−1​​

代码如下:

def longestCommonSubstr(self, word1: str, word2: str) -> int:m = len(word1)n = len(word2)dp = [[0] * (n + 1) for _ in range(m + 1)]# dp[i][j]代表word1以i结尾,word2以j结尾,的最大公共子串的长度max_len = 0row = 0col = 0for i in range(1, m + 1):for j in range(1, n + 1):if word1[i - 1] == word2[j - 1]:dp[i][j] = dp[i - 1][j - 1] + 1if max_len < dp[i][j]:max_len = dp[i][j]row = icol = jmax_str = ""i = rowj = colwhile i > 0 and j > 0:if dp[i][j] == 0:breaki -= 1j -= 1max_str += word1[i]lcstr = max_str[::-1]# 回溯的得到的最长公共子串print(lcstr)return max_len
obj = Solution()
word1 = "caba"
word2 = "abc"
res = obj.longestCommonSubstr(word1, word2)
print(res)
# 2, 子串为ab

dp矩阵的值:

从最长公共子串位置,向前回溯,直到dp对应的值为0,得到最大公共子串的结果

python实现最长公共子串相关推荐

  1. python求最长公共子串_Python-求解两个字符串的最长公共子序列

    一.问题描述 给定两个字符串,求解这两个字符串的最长公共子序列(Longest Common Sequence).比如字符串1:BDCABA:字符串2:ABCBDAB.则这两个字符串的最长公共子序列长 ...

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

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

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

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

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

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

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

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

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

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

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

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

  8. Python最长公共子串

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

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

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

  10. python -- 最长公共子串

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

最新文章

  1. [异常解决] MPU6050启动异常读出陀螺仪和加速度计的值全为0的解决办法
  2. _CRT_SECURE_NO_WARNINGS错误提示,解决办法
  3. 第二篇:cout和endl的用法
  4. 如何快速开发一个 Dubbo 应用?(含沙龙报名)
  5. python处理数据0和负数跳过_Python第十一章-常用的核心模块03-json模块
  6. moodle架构分析---表现层的设计(一)
  7. MyBatis基于Maven入门实例
  8. java: Internal error in the mapping processor: java.lang.NullPointerException问题解决
  9. PHP从入门到接到外包合同,再到放弃
  10. 2019 东北四省赛部分题解 The 13th Chinese Northeast Collegiate Programming Contest
  11. macOS Big Sur 11.6.3 (20G415) 正式版 DMG、ISO、IPSW 下载
  12. Python 数据相关性分析
  13. 机器学习:考试预测实战(特征隐射,独热编码,特征重要性选择,网格搜索调参)
  14. GNU GRUB 2.02系统启动项管理设置
  15. CODJ 1070 秋实大哥打游戏 并查集
  16. TensorFlow常用激活函数及其特点用法(6种)详解
  17. ES5 Array新方法reduce()  数组累加
  18. 前序遍历,中序遍历,后序遍历详解
  19. 月薪20k+的Android面试都问些什么?终获offer
  20. 企业如何选择合适的精益生产方案?

热门文章

  1. 好用的国产Linux深度操作系统Deepin 20.5发布
  2. python对串口助手传入的16进制字符数据进行绘图
  3. 信噪比计算方式(小问题解惑)
  4. 电阻中联分压电路的计算
  5. 如何生成密钥,私钥,签名
  6. Mac下Appium环境搭建
  7. 2个74151实现16位数据选择器以及在Multisim的演示
  8. 微信公众号模板消息推送
  9. markdown语法
  10. 安徽省地理信息系统应用成果