最新资讯:A和B的最长公共子序列是什么?LCS详解
LCS是什么
LCS是Longest Common Subsequence的缩写,即最长公共子序列。一个序列,如果是两个或者多个序列的子序列,并且是所有子序列中最长的,则为最长公共子序列。(有序但不连续也为子序列)
(相关资料图)
序列 13456 和 345674 的最长公共子序列为 3456序列 ABDBC 和 BCDBA 的最长公共子序列为 BDB
LCS可以用来做什么
生物学上用来进行基因序列比对,以推测序列的结构、功能和演化过程用来描述两段文字的”相似性“,可以用来辨别是不是抄袭
怎么计算LCS
暴力穷举法
就是把两个序列所有的子序列都列出来,然后一一进行比较。
假定字符串 A 和 B 的长度分别为 n 和 m,那么 A 共有 2 n − 1 2^n-1 2n−1 个子序列,B 共有 2 m − 1 2^m-1 2m−1 个子序列,然后将任意两个进行一一比较,最后得出 A 和 B 的最长公共子序列。这种算法的时间复杂度是 O ( 2 n + m ) O(2^{n+m}) O(2n+m) ,复杂度太高,当然不推荐使用。
动态规划法
记:
字符串 A ,长度为 n ,从 1 开始;字符串 A ,长度为 n ,从 1 开始。
A i = < A 1 , A 2 , . . . A i > A_i=Ai=即 A 序列的前 i 个字符 ( 1 ≤ i ≤ n ) (1\leq i \leq n) (1≤i≤n) ( A i A_i Ai 计做”字符串 A 的 i 前缀)
B j = < B 1 , B 2 , . . . B j > B_j=Bj=即 B 序列的前 j 个字符 ( 1 ≤ j ≤ m ) (1\leq j \leq m) (1≤j≤m) ( B j B_j Bj 计做”字符串 B 的 j 前缀)
如果 A n = B m A_n=B_m An=Bm (最后一个字符相同),那么 A 和 B 的最长公共子序列 C 的最后一位 C k = A n = B m C_k=A_n=B_m Ck=An=Bm ,那么 L C S ( A , B ) = L C S ( A n − 1 , B m − 1 ) + A n LCS(A,B)=LCS(A_n-1,B_m-1)+A_n LCS(A,B)=LCS(An−1,Bm−1)+An
如果 A n ̸ = B m A_n\not=B_m An̸=Bm ,那么他们的最长公共子序列 C 要么是 L C S ( A n − 1 , B m ) LCS(A_{n-1},B_m) LCS(An−1,Bm) ,要么是 L C S ( A n , B m − 1 ) LCS(A_n,B_{m-1}) LCS(An,Bm−1) ,所以 L C S ( A , B ) = m a x { L C S ( A n − 1 , B m ) , L C S ( A n , B m − 1 ) } LCS(A,B)=max\{LCS(A_{n-1},B_m),LCS(A_n,B_{m-1})\} LCS(A,B)=max{LCS(An−1,Bm),LCS(An,Bm−1)}
1234567
ABDCABA
BABCBDAB
A 3 = B 3 = ′ C ′ A_3=B_3= "C" A3=B3=′C′ 那么 L C S ( B D C , A B C ) = L C S ( B D , A B ) + ′ C ′ LCS(BDC,ABC)=LCS(BD,AB)+"C" LCS(BDC,ABC)=LCS(BD,AB)+′C′
A 5 = B 4 = ′ B ′ A_5=B_4="B" A5=B4=′B′ 那么 L C S ( B D C A B , A B C B ) = L C S ( B D C A , A B C ) + ′ B ′ LCS(BDCAB,ABCB)=LCS(BDCA,ABC)+"B" LCS(BDCAB,ABCB)=LCS(BDCA,ABC)+′B′
A 2 ̸ = B 2 A_2\not=B_2 A2̸=B2 那么 L C S ( B D , A B ) = m a x { L C S ( B , A B ) , L C S ( B D , A ) } LCS(BD,AB)=max\{LCS(B,AB),LCS(BD,A)\} LCS(BD,AB)=max{LCS(B,AB),LCS(BD,A)}
A 4 ̸ = B 5 A_4\not=B_5 A4̸=B5 那么 L C S ( B D C A , A B C B D ) = m a x { L C S ( B D C , A B C B D ) , L C S ( B D C A , A B C B ) } LCS(BDCA,ABCBD)=max\{LCS(BDC,ABCBD),LCS(BDCA,ABCB)\} LCS(BDCA,ABCBD)=max{LCS(BDC,ABCBD),LCS(BDCA,ABCB)}
由以上可以得出
L C S ( A n , B m ) = { L C S ( A n − 1 , B m − 1 + A n ) A n = B m m a x { L C S ( A n − 1 , B m ) , L C S ( A n , B m − 1 ) } A n ̸ = B m LCS(A_n,B_m)=\begin{cases}LCS(A_{n-1},B_{m-1}+A_n) \quad \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \quad A_n=B_m\\ max\{LCS(A_{n-1},B_m),LCS(A_n,B_{m-1})\} \quad A_n\not=B_m\end{cases} LCS(An,Bm)={LCS(An−1,Bm−1+An) An=Bmmax{LCS(An−1,Bm),LCS(An,Bm−1)}An̸=Bm
使用动态规划法求解
首先上一幅图
记一个二维数组 c [ m , n ] c[m,n] c[m,n], c [ i , j ] c[i,j] c[i,j] 的值为 x i x_i xi 和 y j y_j yj 的最长公共子序列的长度,然后不难得出当 i = 0 i=0 i=0 或 j = 0 j=0 j=0 的时候 X i X_i Xi 和 Y j Y_j Yj 的最长公共子序列的长度。然后通过动态规划法的公式得出 c ( i , j ) = { 0 i = 0 , j = 0 c ( i − 1 , j − 1 ) i > 0 , j > 0 , x i = y j m a x { c ( i − 1 , j ) , c ( i , j − 1 ) ) } i > 0 , j > 0 , x i ̸ = y j c(i,j)=\begin{cases}0 \quad \quad \quad \quad i=0,j=0 \\ c(i-1,j-1) \quad \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \quad i>0,j>0,x_i=y_j\\ max\{c(i-1,j),c(i,j-1))\} \quad i>0,j>0,x_i\not=y_j\end{cases} c(i,j)=⎩⎪⎨⎪⎧0i=0,j=0c(i−1,j−1) i>0,j>0,xi=yjmax{c(i−1,j),c(i,j−1))}i>0,j>0,xi̸=yj 然后我们通过公式计算 c ( 1 , 1 ) c(1,1) c(1,1) ,因为 x 1 x_1 x1 和 y 1 y_1 y1 不相等,得出 c ( 1 , 1 ) = m a x { c ( 0 , 1 ) , c ( 1 , 0 ) } = 0 c(1,1)=max \{ c(0,1),c(1,0) \}=0 c(1,1)=max{c(0,1),c(1,0)}=0 。然后依次计算,就会得到图中的值,然后得出 x x x 和 y y y 的最长公共子序列的长度为4。我们在计算的时候会发现一个规律:当 x i = y j x_i=y_j xi=yj 的时候 c ( i , j ) c(i,j) c(i,j) 的值为左上角格子的数加1;当 x i ̸ = y j x_i\not=y_j xi̸=yj 的时候 c ( i , j ) c(i,j) c(i,j) 的值为左侧格子和上边格子中的较大的一个。
代码实现
import sysstr1 = sys.argv[1]str2 = sys.argv[2]len1 = len(str1)len2 = len(str2)maxChildLen = 0lcs_ss = [[0 for i in range(len2 + 1)] for j in range(len1 + 1)]for i in range(1, len1 + 1): for j in range(1, len2 + 1): if str1[i-1] == str2[j-1]: lcs_ss[i][j] = lcs_ss[i-1][j-1] + 1 else: lcs_ss[i][j] = max(lcs_ss[i-1][j], lcs_ss[i][j-1])maxChildLen = lcs_ss[len1][len2]print("str1: %s" % str1)print("str2: %s" % str2)print("LCS: %s" % maxChildLen)
随便输入两个字符串,然后观察打印结果
str1: acedbaestr2: becadeacLCS: 3Process finished with exit code 0
标签:
相关推荐:
最新新闻:
- 当前动态:一站式的开源持续测试平台---MeterSphere
- 【干货】常见密码归纳(入门级)(上)-世界滚动
- 代码执行的意思是什么?代码执行详情介绍 环球快报
- 【java编程】使用系统函数的两种方式_世界快消息
- finally的作用是什么?java异常处理之finally
- 【天天报资讯】零、分析方法基础——PEST分析法(行业分析篇)
- 几何学中多项式是什么?多项式是由变量以及标量的代数式吗?-焦点热文
- 链表中结点的“结”到底是哪个字?节点和结点到底有什么不同?
- 深入理解Java:SimpleDateFormat安全的时间格式化
- 【干货】C++异常处理的三种工具
- 环球微速讯:CART树算法详解 基于训练数据集生成的CART算法
- 中国最出色的互动娱乐企业之一——完美世界-每日视讯
- 智搭36合1创意搭建机器人——STEAM教育的完美课题-热资讯
- HSE配置是什么?频率4-16MHZ的使用方法
- 最新资讯:A和B的最长公共子序列是什么?LCS详解
- 园方回应游客给大熊猫投喂带包装火腿肠:很气愤!
- 这款Steam新作 展现了俄罗斯人眼中的黑暗格林童话
- java中的正则表达式 java.util.regexJava中正则表达式的构造-世界热点评
- 天天看热讯:干货|MindSporeLite整体架构介绍
- 高效的磁力搜索引擎--生产中的测试(二)_全球今日报
- 《街头霸王6》新解说员宣传片公开:日本少女冠军人美声甜!-天天快报
- 《怪物猎人崛起:曙光》主机发售日公开_天天精选
- 环球热头条丨《最后的生还者》PC重制版预告 配置需求公布
- 多人团队射击《恐龙浩劫》将于7月14日正式发售|世界新消息
- 《机械战警:暴戾都市》公布玩法预告延期至9月上市|每日热文
- 床头必备 奥克斯22升小冰箱258元
- 超高颜值 华硕小主机2999元|全球快看点
- 战纹2公布 登录Switch和PC_当前快讯
- 3D打印火箭即将试射
- 百亿补贴便宜100 机械师24寸显示器399元
- 快看点丨复仇爽剧《黑暗荣耀2》明天全集播出:第1季豆瓣8.9
- 【世界独家】internal_server error怎么办
- 《零:月蚀的假面》发售预告片公布 已登陆各平台_热头条
- Epic 2022年度总结:PC用户超2.3亿!送出99款游戏_聚焦
- 固定视角生存恐怖游戏《生者回声》试玩推出 世界时快讯
- 防止App恶意截图 安卓14预览版新功能
- 全球今日报丨万众期待 星空跳票到9月6日
- Homepod对手来了 SONOS新品支持空间音频
- 世界快资讯:电动提取灵魂 音波头部按摩仪149元
- 全球快资讯:索尼担忧微软收购之后COD在PS5上会更差
- 没有五险一金的公司能去吗上班_没有五险一金的公司能去吗
- 热点评!扁平疣的最佳治疗方法是什么(扁平疣的最佳治疗方法)
- 环球速读:《战争雷霆》衍生VR空战游戏《雷霆王牌》公布
- 时讯:传闻:《怪猎崛起:曙光》将于4月28日登陆PS/Xbox
- 【环球新要闻】每天少睡一两个小时算熬夜?专家提醒:大脑会变笨
- 当前头条:U20男足亚洲杯:中国队晋级八强!
- 《闪电十一人》最新作剧情来到初代25年后-世界新资讯
- 天天速递!韩国主帅希望复制02世界杯奇迹:之前能 现在也可以
- 市场监管总局公布第六批查处涉疫药品和医疗用品违法典型案例
- 世界百事通!140W 4060满血释放!ROG新款游戏本首发价9999元
- 世界百事通!140W 4060满血释放!ROG新款游戏本首发价9999元
- 《雷顿教授与蒸汽新世界》新预告 支持简中
- 世界视讯!LadyGaga不会在95届奥斯卡表演 忙于拍摄《小丑2》
- 拒绝网红打卡拍照!宜家仓库后山姆也禁拍网红照:简讯
- 《使命召唤17:黑色行动5》Steam特别好评:T组制作必属精品
- 世界百事通!大话新手序列号领取_大话外传新篇精英回归序列号礼包领取
- 全球视点!赋能青少年健康成长 泰州首个民间社会组织“关工委”成立
- 我国新发现一颗近地小行星:直径约200m 俩足球场大
- PS港服会员优惠来了:升级二档三档可享65折优惠_世界热点评
- 《零:月蚀的假面》Steam特别好评 峰值863人
- 389元1TB固态10年质保3400MB/s
- 美洽代表成都高新区企业,出海赴欧开拓新市场
- 毕设在即,电脑硬盘崩了,有哪款比较值得购买的SSD?:世界信息
- iPhone 14 Plus黄色刚发布就破发:立减800 当前观点
- 小米Buds 4 Pro无线耳机即将在国际市场推出、支持蓝牙5.3:观速讯
- Nacon发行商折扣周1折起 《钢铁崛起》75.9元|环球速递
- 数据显示:67%的《卧龙》Xbox玩家没能击败张梁
- 全球动态:游戏囧图:单马尾蒂法好凶 双生舞伶本尊COS来了
- 欺骗感情!90后男子承诺捐1100万没兑现成老赖:985母校怒起诉|焦点
- 环球观速讯丨黑暗童话《惊悚故事3:英格莉忏悔录》今日登陆Steam
- 矿卡崩了也没事!英伟达自信表态:我们游戏显卡也很行-天天热推荐
- 停止续约!米兰体育报:“现在不应该分心,应当全力...
- 焦点热门:PS中国发布《卧龙:苍天陨落》PS5性能宣传片 沉浸体验乱世三国
- 《生化危机4:重制版》广告疑似泄露:试玩Demo明天上线!_每日精选
- 当前信息:《蓓优妮塔起源:瑟蕾莎与迷失的恶魔》公布剧情预告片
- 重获新“声” 清华研发可穿戴人工喉咙还原准确率超90%
- 点亮尘封文明 解谜游戏《落叶城》NS版3月16日推出:快看
- 兼容 13 代酷睿,昂达推出两款主板,售价仅 449 元起
- 独居女生的浪漫之选三星BESOPKEHOME让女性拥抱自我-每日头条
- 聚焦女性健康,腾讯公益“关爱女性健康小红花日”项目启动
- 天天要闻:直降 1000 元,ROG 6 游戏手机优惠抢购,16GB+512GB 豪华配置
- iPhone 攻下日本手机一半市场,第二名夏普,小米等国产机只在 others
- 每日观点:梁朝伟称想重新尝试拍电视剧:美剧、韩剧都可接受
- 外媒:《星空》延期至9月恰好避开了大作云集的夏季
- 《原子之心》双生舞伶扮演者COS自己 自称闲暇时也会玩游戏-今头条