字符串最长公共子序列python_求解两个字符串的最长公共子序列

一,问题描述

给定两个字符串,求解这两个字符串的最长公共子序列(Longest Common Sequence)。比如字符串1:BDCABA;字符串2:ABCBDAB

则这两个字符串的最长公共子序列长度为4,最长公共子序列是:BCBA

二,算法求解

这是一个动态规划的题目。对于可用动态规划求解的问题,一般有两个特征:①最优子结构;②重叠子问题

①最优子结构

设 X=(x1,x2,.....xn) 和 Y={y1,y2,.....ym} 是两个序列,将 X 和 Y 的最长公共子序列记为LCS(X,Y)

找出LCS(X,Y)就是一个最优化问题。因为,我们需要找到X 和 Y中最长的那个公共子序列。而要找X 和 Y的LCS,首先考虑X的最后一个元素和Y的最后一个元素。

1)如果 xn=ym,即X的最后一个元素与Y的最后一个元素相同,这说明该元素一定位于公共子序列中。因此,现在只需要找:LCS(Xn-1,Ym-1)

LCS(Xn-1,Ym-1)就是原问题的一个子问题。为什么叫子问题?因为它的规模比原问题小。(小一个元素也是小嘛....)

为什么是最优的子问题?因为我们要找的是Xn-1和 Ym-1 的最长公共子序列啊。。。最长的!!!换句话说,就是最优的那个。(这里的最优就是最长的意思)

2)如果xn != ym,这下要麻烦一点,因为它产生了两个子问题:LCS(Xn-1,Ym) 和 LCS(Xn,Ym-1)

因为序列X 和 序列Y 的最后一个元素不相等嘛,那说明最后一个元素不可能是最长公共子序列中的元素嘛。(都不相等了,怎么公共嘛)。

LCS(Xn-1,Ym)表示:最长公共序列可以在(x1,x2,....x(n-1)) 和 (y1,y2,...yn)中找。

LCS(Xn,Ym-1)表示:最长公共序列可以在(x1,x2,....xn) 和 (y1,y2,...y(n-1))中找。

求解上面两个子问题,得到的公共子序列谁最长,那谁就是 LCS(X,Y)。用数学表示就是:

LCS=max{LCS(Xn-1,Ym),LCS(Xn,Ym-1)}

由于条件 1)  和  2)  考虑到了所有可能的情况。因此,我们成功地把原问题 转化 成了 三个规模更小的子问题。

②重叠子问题

重叠子问题是啥?就是说原问题 转化 成子问题后,  子问题中有相同的问题。咦?我怎么没有发现上面的三个子问题中有相同的啊????

OK,来看看,原问题是:LCS(X,Y)。子问题有 ❶LCS(Xn-1,Ym-1)    ❷LCS(Xn-1,Ym)    ❸LCS(Xn,Ym-1)

初一看,这三个子问题是不重叠的。可本质上它们是重叠的,因为它们只重叠了一大部分。举例:

第二个子问题:LCS(Xn-1,Ym) 就包含了:问题❶LCS(Xn-1,Ym-1),为什么?

因为,当Xn-1 和 Ym 的最后一个元素不相同时,我们又需要将LCS(Xn-1,Ym)进行分解:分解成:LCS(Xn-1,Ym-1) 和 LCS(Xn-2,Ym)

也就是说:在子问题的继续分解中,有些问题是重叠的。

由于像LCS这样的问题,它具有重叠子问题的性质,因此:用递归来求解就太不划算了。因为采用递归,它重复地求解了子问题啊。而且注意哦,所有子问题加起来的个数 可是指数级的哦。。。。

这篇文章中就演示了一个递归求解重叠子问题的示例。

那么问题来了,你说用递归求解,有指数级个子问题,故时间复杂度是指数级。这指数级个子问题,难道用了动态规划,就变成多项式时间了??

呵呵哒。。。。

关键是采用动态规划时,并不需要去一 一 计算那些重叠了的子问题。或者说:用了动态规划之后,有些子问题 是通过 “查表“ 直接得到的,而不是重新又计算一遍得到的。废话少说:举个例子吧!比如求Fib数列。关于Fib数列,可参考:

求fib(5),分解成了两个子问题:fib(4) 和 fib(3),求解fib(4) 和 fib(3)时,又分解了一系列的小问题....

从图中可以看出:根的左右子树:fib(4) 和 fib(3)下,是有很多重叠的!!!比如,对于 fib(2),它就一共出现了三次。如果用递归来求解,fib(2)就会被计算三次,而用DP(Dynamic Programming)动态规划,则fib(2)只会计算一次,其他两次则是通过”查表“直接求得。而且,更关键的是:查找求得该问题的解之后,就不需要再继续去分解该问题了。而对于递归,是不断地将问题分解,直到分解为 基准问题(fib(1) 或者 fib(0))

说了这么多,还是要写下最长公共子序列的递归式才完整。借用网友的一张图吧:)

c[i,j]表示:(x1,x2....xi) 和 (y1,y2...yj) 的最长公共子序列的长度。(是长度哦,就是一个整数嘛)。公式的具体解释可参考《算法导论》动态规划章节

三,LCS python实现

1 defLCS(str1, str2):2 c = [[0 for i in range(len(str2)+1)] for j in range(len(str1)+1)]3 for i in range(1, len(str1)+1):4 for j in range(1, len(str2)+1):5 if str1[i-1] == str2[j-1]:6 c[i][j] = c[i-1][j-1] + 1

7 else:8 c[i][j] = max(c[i][j-1], c[i-1][j])9 printc10 return c[-1][-1]11

12 if __name__ == '__main__':13 str1 = 'BDCABA'

14 str2 = 'ABCBDAB'

15 print LCS(str1, str2)

感觉整个代码就是直接根据上面的那个递归表达式写的。

①第1行定义一个数组来保存最长公共子序列的长度

②第7,8行,就是递归表达式的程序表示。就是:  c[i,j] = max{c[i][j-1], c[i-1][j]}

③第10行返回最终结果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/470285.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

React中使用ref

一、如何使用ref 在React的开发模式中,通常情况下不需要、也不建议直接操作DOM原生,但是某些特殊的情况,确实需要获取到DOM进行某些操作: 管理焦点,文本选择或媒体播放;触发强制动画;集成第三方…

python合并word表格单元格_python docx模块读取word表格遇到合并单元格时的处理

python docx模块读取word表格遇到合并单元格时的处理python docx模块读取word表格遇到合并单元格时的处理python docx模块读取word表 遇到合并单元格时的处理通过docx模块,读取word里面表格,并进行修改。现在我遇到的表格是这样:里面行&#…

React中的受控组件和非受控组件

一、认识受控组件 在React中,HTML表单的处理方式和普通的DOM元素不太一样:表单元素通常会保存在一些内部的state。 比如下面的HTML表单元素: 这个处理方式是DOM默认处理HTML表单的行为,在用户点击提交时会提交到某个服务器中&…

关于div居中

margin : 100px; margin-left: auto; margin-right: auto; 这样子设置css样式就可以实现一个div居中转载于:https://www.cnblogs.com/jiangjing/p/5764820.html

JavaScrip入门-变量计算%函数

哈 <html> <body> <script>var hello"Hello ";hellohello" world!";var age1161;var age220var ottrue; document.write(helloage1);<!--Hello world!17 因为中间空两行 -->document.write(age1age2);//falsedocument.write(age1 …

摩尔斯电码转换python编码_Morse Code 用Python做个摩斯密码转换器

摩斯密码摩尔斯电码(又译为摩斯密码&#xff0c;Morse code)是一种时通时断的信号代码&#xff0c;通过不同的排列顺序来表达不同的英文字母、数字和标点符号&#xff0c;不同于现代只使用零和一两种状态的二进制代码&#xff0c;它的代码包括五种&#xff1a; 点、划、点和划之…

JS动画 | 用TweenMax实现收集水滴效果

之前在CodePen上接触了TweenMax, 被它能做到的酷炫效果震撼了. (文末放了5个GSAP的效果GIF) 最近要做一个"收集水滴"的动效, 于是就试用了一下TweenMax实现这个效果. 什么是TweenMax TweenMax是GSAP(GreenSock Animation Platform)创作的动画工具库. GSAP的产品除了T…

React中的组件通信——父传子、子传父、Context

0、认识组件间的通信 在开发过程中&#xff0c;我们会经常遇到需要组件之间相互进行通信&#xff1a; 比如App可能使用了多个Header&#xff0c;每个地方的Header展示的内容不同&#xff0c;那么我们就需要使用者传递给Header一些数据&#xff0c;让其进行展示&#xff1b;又比…

python控制步进电机驱动器_树莓派操作案例1-使用python GPIO+TB6612驱动步进电机

原理图:接口说明A控制信号输入------PWMA VM ------电机驱动电压输入端(4.5V-15V)A电机输入端2 ------AIN2 VCC ------逻辑电平输入端(2.7V-5.5V)A电机输入端1 ------AIN1 GND ------ 接地正常工作/待机状态控制端------STBY …

遍历输出所有子视图(View)

传入一个View,可以获取传入视图的所有子视图&#xff0c;写入桌面&#xff0c;可以在火狐浏览器下查看 /*** 程序获得了焦点就会自动调用这个方法(只要程序获得了焦点,所有控件才能接收触摸事件)*/ - (void)applicationDidBecomeActive:(UIApplication *)application {NSStrin…

React ref的转发

在前面学习ref时讲过&#xff0c;ref不能应用于函数式组件&#xff1a; 因为函数式组件没有实例&#xff0c;所以不能获取到对应的组件对象 但是&#xff0c;在开发中我们可能想要获取函数式组件中某个元素的DOM&#xff0c;这个时候我们应该如何操作呢&#xff1f; 方式一&…

python tkinter 输入数字 小数_Python3 tkinter基础 Entry validate isdigit 只能输入数字的输入框...

Python : 3.7.0OS : Ubuntu 18.04.1 LTSIDE : PyCharm 2018.2.4Conda : 4.5.11typesetting : Markdowncode"""Author : 行初心Date : 18-10-1Blog : www.cnblogs.com/xingchuxinGitee : gitee.com/zhichengjiu"""from tkinter import *def test(…

电脑桌面 IE 图标删除不了的解决方法

电脑换了系统之后想把桌面的IE浏览器给删掉&#xff0c;可是直接删除又删不掉&#xff0c;杀毒软件查杀也没有问题。找了很多方法&#xff0c;终于才把它给解决了。下面&#xff0c;就把我的方法分享给桌面ie图标删除不了的解决方法&#xff0c;希望能对大家有所帮助! 方法 1 1…

React Portals的使用

某些情况下&#xff0c;我们希望渲染的内容独立于父组件&#xff0c;甚至是独立于当前挂载到的DOM元素中&#xff08;默认都是挂载到id为root的DOM元 素上的&#xff09;。 Portal 提供了一种将子节点渲染到存在于父组件以外的 DOM 节点的优秀的方案&#xff1a; 第一个参数&a…

绿盟防火墙配置手册_双链路环境下不同品牌防火墙更换案例分享

关注“IT实战基地”&#xff0c;与行业大咖交流学习&#xff01;引言不同品牌防火墙在整体更换时&#xff0c;实施迁移时除了将防火墙的接口IP地址&#xff0c;路由&#xff0c;安全策略进行迁移时&#xff0c;在实际更换时还可能遇到一切奇怪的问题&#xff0c;尤其是在双链路…

React中的fragment和StrictMode

一、fragment 在之前的开发中&#xff0c;我们总是在一个组件中返回内容时包裹一个div元素&#xff1a; 我们又希望可以不渲染这样一个div应该如何操作呢&#xff1f; 使用FragmentFragment 允许你将子列表分组&#xff0c;而无需向 DOM 添加额外节点&#xff1b; React还…

怎么让车辆gps定位失效_如何更有效地检测车辆gps定位器?

GPS定位器可以帮助我们管理我们心爱的汽车&#xff0c;在任何时候定位和查询车辆的位置&#xff0c;并跟踪车辆防盗&#xff0c;一些汽车公司和公共交通企业也可以管理和调度车队&#xff0c;管理数据&#xff0c;并根据GPS定位器分析数据&#xff0c;实现智能和现代交通。GPS定…

云平台需要开发的底层功能

1、WEB与手机的消息通讯 http://www.rongcloud.cn/docs/web.html 可以实现各种系统消息的WEB和手机同时接收。 2、扩展底层支持幼儿&#xff0c;基础&#xff0c;职业&#xff0c;高师全领域&#xff0c;从人员&#xff0c;机构&#xff0c;部门&#xff0c;院系&#xff0c;专…

React中的CSS——styled-components

一、认识CSS in JS 实际上&#xff0c;官方文档也有提到过CSS in JS这种方案&#xff1a; https://zh-hans.reactjs.org/docs/faq-styling.html “CSS-in-JS” 是指一种模式&#xff0c;其中 CSS 由 JavaScript 生成而不是在外部文件中定义&#xff1b;注意此功能并不是 Reac…

l380废墨收集垫已到使用寿命_湖北雨水收集系统定制

淮北海聚环保设备有限公司为您详细解读jrWVof湖北雨水收集系统定制的相关知识与详情&#xff0c; 1、三格化粪池&#xff0c;可设想为长方形或圆形。各粪池容积计较根据粪水储存时间定&#xff0c;即一般可按2&#xff1a;1&#xff1a;3计较。号池储存20天&#xff0c;2…