1. 最长公共子序列(LCS)

1.1 问题描述

1.2 思路

利用动态规划。

下一步就要找到状态之间的转换方程。

因此可以根据这个方程来进行填表,以"helloworld"和“loop”为例:

1.3 Python代码

def LCS(string1,string2):len1 = len(string1)len2 = len(string2)res = [[0 for i in range(len1+1)] for j in range(len2+1)]for i in range(1,len2+1):for j in range(1,len1+1):if string2[i-1] == string1[j-1]:res[i][j] = res[i-1][j-1]+1else:res[i][j] = max(res[i-1][j],res[i][j-1])return res,res[-1][-1]
print(LCS("helloworld","loop"))
# 输出结果为:
[[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],[0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1],[0, 0, 0, 1, 1, 2, 2, 2, 2, 2, 2],[0, 0, 0, 1, 1, 2, 2, 3, 3, 3, 3],[0, 0, 0, 1, 1, 2, 2, 3, 3, 3, 3]], 3

所以"helloworld"和"loop"的最长公共子序列的长度为3。

1.4 找到具体的子序列

下面的内容借鉴了博主Running07的博客动态规划 最长公共子序列 过程图解

如果有两个字符串如下:
S1 = “123456778”
S2 = “357486782”
其最终的动态规划填表结果为:

其中S1和S2的LCS并不是只有1个。
我们根据递归公式:

构建了上表,
通过递推公式,可以看出,res[i][j]的值来源于res[i-1][j]或者是res[i-1][j]和res[i][j-1]的较大值(可能相等)。
我们将从最后一个元素c[8][9]倒推出S1和S2的LCS。
res[8][9] = 5,且S1[8] != S2[9],所以倒推回去,res[8][9]的值来源于c[8][8]的值(因为res[8][8] > res[7][9])。
res[8][8] = 5, 且S1[8] = S2[8], 所以倒推回去,res[8][8]的值来源于 res[7][7]。
以此类推,如果遇到S1[i] != S2[j] ,且res[i-1][j] = res[i][j-1] 这种存在分支的情况,这里都选择一个方向(之后遇到这样的情况,也选择相同的方向,要么都往左,要么都往上)。

可得S1和S2的LCS为{3、5、7、7、8} 这是遇见相等的时候,统一往左走
S1和S2之间还有一个LCS 这是遇见相等的时候,统一往上走

可得S1和S2的LCS为{3、4、6、7、8}

2. 最长公共子串

2.1 问题描述

2.2 思路

和最长公共子序列一样,使用动态规划的算法。
下一步就要找到状态之间的转换方程。
和LCS问题唯一不同的地方在于当A[i] != B[j]时,res[i][j]就直接等于0了,因为子串必须连续,且res[i][j] 表示的是以A[i],B[j]截尾的公共子串的长度。因此可以根据这个方程来进行填表,以"helloworld"和“loop”为例:

这个和LCS问题还有一点不同的就是,需要设置一个res,每一步都更新得到最长公共子串的长度。

2.3 Python代码

def LCstring(string1,string2):len1 = len(string1)len2 = len(string2)res = [[0 for i in range(len1+1)] for j in range(len2+1)]result = 0for i in range(1,len2+1):for j in range(1,len1+1):if string2[i-1] == string1[j-1]:res[i][j] = res[i-1][j-1]+1result = max(result,res[i][j])  return result
print(LCstring("helloworld","loop"))
# 输出结果为:2

动态规划经典例题——最长公共子序列和最长公共子串(python)相关推荐

  1. 【动态规划】最长公共子序列与最长公共子串

    1. 问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与 ...

  2. 【恋上数据结构】动态规划(找零钱、最大连续子序列和、最长上升子序列、最长公共子序列、最长公共子串、0-1背包)

    动态规划(Dynamic Programming) 练习1:找零钱 找零钱 - 暴力递归 找零钱 - 记忆化搜索 找零钱 - 递推 思考题:输出找零钱的具体方案(具体是用了哪些面值的硬币) 找零钱 - ...

  3. 数组字符串那些经典算法:最大子序列和,最长递增子序列,最长公共子串,最长公共子序列,字符串编辑距离,最长不重复子串,最长回文子串 (转)...

    作者:寒小阳 时间:2013年9月. 出处:http://blog.csdn.net/han_xiaoyang/article/details/11969497. 声明:版权所有,转载请注明出处,谢谢 ...

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

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

  5. 一分钟搞定最长公共子序列与最长公共子串的问题

    感谢大家的理解与指正!觉的写的不错的小伙伴儿,一键三连支持一下,后期会有持续更新!!抱拳了罒ω罒   最长公共子序列和最长公共子串都是动态规划的经典题型,最长公共子序列要求的是不一定连续,最长公共子串 ...

  6. 最大子序列、最长递增子序列、最长公共子串、最长公共子序列、字符串编辑距离

    最大子序列 最大子序列是要找出由数组成的一维数组中和最大的连续子序列.比如{5,-3,4,2}的最大子序列就是 {5,-3,4,2},它的和是8,达到最大:而 {5,-6,4,2}的最大子序列是{4, ...

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

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

  8. 最长公共子序列暴力法C语言,利用C++实现最长公共子序列与最长公共子串

    一.问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与母 ...

  9. ヾ(o◕∀◕)ノヾ各种动态规划经典例题(新手向、多类型)

    ヾ(o◕∀◕)ノヾ各种动态规划经典例题(新手向.多类型) 一.前言 ヾ(・ω・`。)我把比较常见的类型的动态规划找了一些经典的例题,适合作为新手的入门例题,用于帮助我们对各种不同的动态规划有所了解,很 ...

  10. 最长上升子序列、最长公共子序列、最长公共上升子序列(LIS、LCS、LCIS)

    LIS.LCS.LCIS 最长上升子序列LIS 最长公共子序列LCS 最长公共上升子序列LCIS 最长上升子序列LIS 题目链接:AcWing895. 最长上升子序列 这里只说明 O ( n 2 ) ...

最新文章

  1. 什么是CPython
  2. 单片机原理及其应用——单片机控制8只发光二极管交替闪烁
  3. HttpClient的超时用法小记
  4. 架构大型企业Java项目–我的虚拟JUG会话
  5. 博阅电纸书_【博阅电纸书】博阅 M1 柠檬电纸书阅读器评测,博阅T62电纸书评测_什么值得买...
  6. Linux下修改时间时区
  7. 20-spring学习-Spring MVC基本操作
  8. zend反编译-dezender 使用
  9. [转帖]SAP S/4 HANA与SAP Business Suite/R3(ECC)的区别
  10. telnet中去除ntlm验证的方法
  11. Windows 序列号查看
  12. 普中28335开发攻略_TMS320F28335项目开发记录5_28335之CCS编程基础
  13. php根据两点经纬度计算距离
  14. 手机计算机星点符号是除吗,手机星号怎么打
  15. 荣耀8更改微信提示音
  16. atob()和btoa() 进行base64的编码和解码
  17. 流形学习(二) Isomap 在 MATLAB 中的实现及实例
  18. cesium中实现鼠标拖动实体功能
  19. 聊聊IO——阻塞?非阻塞?同步?非同步?
  20. Sufficient Statistic (充分统计量)

热门文章

  1. python normalize函数_Python normalize包_程序模块 - PyPI - Python中文网
  2. 跨越信息沟通的障碍,构建企业高效应用平台
  3. 股市行情图原来是这样实现的
  4. 解读数字孪生概念 —— 智慧城市大脑
  5. 使用socket时遇见的java.io.EOFException异常
  6. 外国某高校的中国歷史科目期末考试题
  7. 网站被攻击如何修复网站漏洞
  8. java谜题读书笔记_《java深度历险》读书笔记(一)
  9. 用黑莓手机来使电脑上网
  10. 动态规划 -- 活动时间问题