电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Python求兩個字符串最長公共子序列代碼實例

瀏覽:6日期:2022-08-03 18:39:27

一、問題描述

給定兩個字符串,求解這兩個字符串的最長公共子序列(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的最后一個元素。

⑴如果xn=ym,即X的最后一個元素與Y的最后一個元素相同,這說明該元素一定位于公共子序列中。因此,現在只需要找:LCS(Xn-1,Ym-1)

LCS(Xn-1,Ym-1)就是原問題的一個子問題。為什么叫子問題?因為它的規模比原問題小。

為什么是最優的子問題?因為我們要找的是Xn-1和Ym-1的最長公共子序列啊。最長的!換句話說就是最優的那個。

⑵如果xn!=ym,這下要麻煩一點,因為它產生了兩個子問題:LCS(Xn-1,Ym)和LCS(Xn,Ym-1)

因為序列X和序列Y的最后一個元素不相等,那說明最后一個元素不可能是最長公共子序列中的元素。

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

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

求解上面兩個子問題,得到的公共子序列誰最長,那誰就是LCS(X,Y)。用數學表示就是:

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

由于條件⑴和⑵考慮到了所有可能的情況。因此,我們成功的把原問題轉化成了三個規模更小的問題。

②重疊子問題

重疊子問題是什么?就是說原問題轉化成子問題后,子問題中有相同的問題。

原問題是: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-1)進行分解:分解成:LCS(Xn-1,Ym-1)和LCS(Xn-2,Ym)

也就是說:在子問題的繼續分解中,有些問題是重疊的。

由于像LCS這樣的問題,它具有重疊子問題的性質,因此:用遞歸來求解就太不劃算了。國為采用遞歸,它重復地求解了子問題,而且需要注意的是,所有子問題加起來的個數是指數級的。

那么問題來了,如果用遞歸求解,有指數級個子問題,故時間復雜度是指數級的。這指數級個子問題,難道用了動態規劃,就變成多項式時間了??

關鍵是采用動態規劃時,并不需要去一一計算那些重疊了的子問題。或者說:用了動態規劃之后,有些子問題是通過“查表”直接得到的,而不是重新又計算一遍得到的。舉個例子:比如求Fib數列。

Python求兩個字符串最長公共子序列代碼實例

求fib(5),分解成了兩個子問題:fib(4)和fib(3),求解fib(4)和fib(3)時,又分解了一系列的小問題...

從圖中可以看出:根的左右子樹:fib(4)和fib(3)下,是有很多重疊的!比如,對于fib(2),它就一共出現了三次。如果用遞歸來求解,fib(2)就會被計算三次,而用DP(Dynamic Programming)動態規劃,則fib(2)只會計算一次,其他兩次則是通過“查表”直接求得。而且,更關鍵的是:查找求得該問題的解之后,就不需要再繼續去分解該問題了。而對于遞歸,是不斷地將問題解,直到分解為基準問題(fib(0)或者fib(1))

說了這么多,還是寫下最長公共子序列的遞歸式才完整。

Python求兩個字符串最長公共子序列代碼實例

C[i,j]表示:(x1,x2,...,xi)和(y1,y2,...,yj)的最長公共子序列的長度。公式的具體解釋可參考《算法導論》動態規劃章節

三、LCS Python代碼實現

#! /usr/bin/env python3# -*- coding:utf-8 -*-# Author : mayi# Blog : http://www.cnblogs.com/mayi0312/# Date : 2019/5/16# Name : test03# Software : PyCharm# Note : 用于實現求解兩個字符串的最長公共子序列def longestCommonSequence(str_one, str_two, case_sensitive=True): ''' str_one 和 str_two 的最長公共子序列 :param str_one: 字符串1 :param str_two: 字符串2(正確結果) :param case_sensitive: 比較時是否區分大小寫,默認區分大小寫 :return: 最長公共子序列的長度 ''' len_str1 = len(str_one) len_str2 = len(str_two) # 定義一個列表來保存最長公共子序列的長度,并初始化 record = [[0 for i in range(len_str2 + 1)] for j in range(len_str1 + 1)] for i in range(len_str1): for j in range(len_str2): if str_one[i] == str_two[j]:record[i + 1][j + 1] = record[i][j] + 1 elif record[i + 1][j] > record[i][j + 1]:record[i + 1][j + 1] = record[i + 1][j] else:record[i + 1][j + 1] = record[i][j + 1] return record[-1][-1]if __name__ == ’__main__’: # 字符串1 s1 = 'BDCABA' # 字符串2 s2 = 'ABCBDAB' # 計算最長公共子序列的長度 res = longestCommonSequence(s1, s2) # 打印結果 print(res) # 4

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 西点培训学校_法式西点培训班_西点师培训_西点蛋糕培训-广州烘趣西点烘焙培训学院 | 线材成型机,线材折弯机,线材成型机厂家,贝朗自动化设备有限公司1 | 植筋胶-粘钢胶-碳纤维布-碳纤维板-环氧砂浆-加固材料生产厂家-上海巧力建筑科技有限公司 | 上海电子秤厂家,电子秤厂家价格,上海吊秤厂家,吊秤供应价格-上海佳宜电子科技有限公司 | 渗透仪-直剪仪-三轴仪|苏州昱创百科 | 地磅-地秤-江阴/无锡地磅-江阴天亿计量设备有限公司_ | 免费B2B信息推广发布平台 - 推发网 | 蒜肠网-动漫,二次元,COSPLAY,漫展以及收藏型模型,手办,玩具的新媒体.(原变形金刚变迷TF圈) | 锂电混合机-新能源混合机-正极材料混料机-高镍,三元材料混料机-负极,包覆混合机-贝尔专业混合混料搅拌机械系统设备厂家 | 飞飞影视_热门电影在线观看_影视大全 | 胀套-锁紧盘-风电锁紧盘-蛇形联轴器「厂家」-瑞安市宝德隆机械配件有限公司 | 高中学习网-高考生信息学习必备平台| 温州食堂承包 - 温州市尚膳餐饮管理有限公司 | 金属切削液-脱水防锈油-电火花机油-抗磨液压油-深圳市雨辰宏业科技发展有限公司 | 创富网-B2B网站|供求信息网|b2b平台|专业电子商务网站 | 铣刨料沥青破碎机-沥青再生料设备-RAP热再生混合料破碎筛分设备 -江苏锡宝重工 | 玖容气动液压设备有限公司-气液增压缸_压力机_增压机_铆接机_增压器 | 广西正涛环保工程有限公司【官网】 | 空气能采暖,热泵烘干机,空气源热水机组|设备|厂家,东莞高温热泵_正旭新能源 | 进口消泡剂-道康宁消泡剂-陶氏消泡剂-大洋消泡剂 | 软文推广发布平台_新闻稿件自助发布_媒体邀约-澜媒宝 | 济南玻璃安装_济南玻璃门_济南感应门_济南玻璃隔断_济南玻璃门维修_济南镜片安装_济南肯德基门_济南高隔间-济南凯轩鹏宇玻璃有限公司 | 北京三友信电子科技有限公司-ETC高速自动栏杆机|ETC机柜|激光车辆轮廓测量仪|嵌入式车道控制器 | 深圳网站建设-高端企业网站开发-定制网页设计制作公司 | 橡胶粉碎机_橡胶磨粉机_轮胎粉碎机_轮胎磨粉机-河南鼎聚重工机械制造有限公司 | 礼至家居-全屋定制家具_一站式全屋整装_免费量房设计报价 | 安全阀_弹簧式安全阀_美标安全阀_工业冷冻安全阀厂家-中国·阿司米阀门有限公司 | 执业药师报名条件,考试时间,考试真题,报名入口—首页 | 钛合金标准件-钛合金螺丝-钛管件-钛合金棒-钛合金板-钛合金锻件-宝鸡远航钛业有限公司 | 搪瓷搅拌器,搪玻璃搅拌器,搪玻璃冷凝器_厂家-淄博越宏化工设备 | 比士亚-专业恒温恒湿酒窖,酒柜,雪茄柜的设计定制 | 六自由度平台_六自由度运动平台_三自由度摇摆台—南京全控科技 | 阿里巴巴诚信通温州、台州、宁波、嘉兴授权渠道商-浙江联欣科技提供阿里会员办理 | 成都软件开发_OA|ERP|CRM|管理系统定制开发_成都码邻蜀科技 | 高压贴片电容|贴片安规电容|三端滤波器|风华电容代理南京南山 | 废气处理设备-工业除尘器-RTO-RCO-蓄热式焚烧炉厂家-江苏天达环保设备有限公司 | 钢化玻璃膜|手机钢化膜|钢化膜厂家|手机保护膜-【东莞市大象电子科技有限公司】 | 北京网站建设首页,做网站选【优站网】,专注北京网站建设,北京网站推广,天津网站建设,天津网站推广,小程序,手机APP的开发。 | 信阳网站建设专家-信阳时代网联-【信阳网站建设百度推广优质服务提供商】信阳网站建设|信阳网络公司|信阳网络营销推广 | 衡阳耐适防护科技有限公司——威仕盾焊接防护用品官网/焊工手套/焊接防护服/皮革防护手套 | 广州二手电缆线回收,旧电缆回收,广州铜线回收-广东益福电缆线回收公司 |