python实现最长公共子串
介绍
子串和子序列的意思不一样,如下图所示,子序列不要求连续,只需要在给定序列中出现过,并且相对顺序一致。而子串需要连续。
图片来自动态规划 最长公共子序列 过程图解
最长公共子串:
同时出现在两个字符串中的最长子串
实现
使用动态规划的方法,思想如下:
对于两个字符串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实现最长公共子串相关推荐
- python求最长公共子串_Python-求解两个字符串的最长公共子序列
一.问题描述 给定两个字符串,求解这两个字符串的最长公共子序列(Longest Common Sequence).比如字符串1:BDCABA:字符串2:ABCBDAB.则这两个字符串的最长公共子序列长 ...
- python实现编辑距离,最长公共子序列,最长公共子串
python实现编辑距离 python实现最大公共子序列 python实现最长公共子串
- java实现最长连续子序列_最长公共子序列/最长公共子串 Python/Java实现
关注我的微信公众号:后端技术漫谈 不定期推送关于后端开发.爬虫.算法题.数据结构方面的原创技术文章,以及生活中的逸闻趣事. 我目前是一名后端开发工程师.主要关注后端开发,数据安全,网络爬虫,物联网,边 ...
- Algorithm:C++/python语言实现之求旋转数组最小值、求零子数组、求最长公共子序列和最长公共子串、求LCS与字符串编辑距离
Algorithm:C++/python语言实现之求旋转数组最小值.求零子数组.求最长公共子序列和最长公共子串.求LCS与字符串编辑距离 目录 一.求旋转数组最小值 1.分析问题 2.解决思路 二.求 ...
- 用Python计算最长公共子序列和最长公共子串
如何用Python计算最长公共子序列和最长公共子串 1. 什么是最长公共子序列?什么是最长公共子串? 1.1. 最长公共子序列(Longest-Common-Subsequences,LCS) 最长公 ...
- 【236】Python求列表最长字符串及lambda和最长公共子串
♣ 题目部分(原文见公众号:python宝) python宝: https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=MzU5Nj ...
- LCS/最长公共子序列/最长公共子串 实现 Python/Java
参考 http://blog.csdn.net/u012102306/article/details/53184446 http://blog.csdn.net/hrn1216/article/det ...
- Python最长公共子串
Python最长公共子串 方法一 最简单最容易想到的方法,去数组第一个元素为最长公共前缀,如果是,就return,如果不是就减去最后一个单词.只到找到位置. class Solution:def lo ...
- [Python]获取2个字符串的最长公共子串
原创文章,欢迎转载.转载请注明:转载自 祥的博客 原文链接:https://blog.csdn.net/humanking7/article/details/84645055 文章目录 @[toc] ...
- python -- 最长公共子串
#! /usr/bin/env python3 # -*- coding: utf-8 -*-# 对于最长公共子串问题,答案为网格中最大的数字--它可能并不位于最后的单元格中def findlonge ...
最新文章
- [异常解决] MPU6050启动异常读出陀螺仪和加速度计的值全为0的解决办法
- _CRT_SECURE_NO_WARNINGS错误提示,解决办法
- 第二篇:cout和endl的用法
- 如何快速开发一个 Dubbo 应用?(含沙龙报名)
- python处理数据0和负数跳过_Python第十一章-常用的核心模块03-json模块
- moodle架构分析---表现层的设计(一)
- MyBatis基于Maven入门实例
- java: Internal error in the mapping processor: java.lang.NullPointerException问题解决
- PHP从入门到接到外包合同,再到放弃
- 2019 东北四省赛部分题解 The 13th Chinese Northeast Collegiate Programming Contest
- macOS Big Sur 11.6.3 (20G415) 正式版 DMG、ISO、IPSW 下载
- Python 数据相关性分析
- 机器学习:考试预测实战(特征隐射,独热编码,特征重要性选择,网格搜索调参)
- GNU GRUB 2.02系统启动项管理设置
- CODJ 1070 秋实大哥打游戏 并查集
- TensorFlow常用激活函数及其特点用法(6种)详解
- ES5 Array新方法reduce() 数组累加
- 前序遍历,中序遍历,后序遍历详解
- 月薪20k+的Android面试都问些什么?终获offer
- 企业如何选择合适的精益生产方案?