亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術(shù)文章
文章詳情頁

Python求兩個(gè)字符串最長(zhǎng)公共子序列代碼實(shí)例

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

一、問題描述

給定兩個(gè)字符串,求解這兩個(gè)字符串的最長(zhǎng)公共子序列(Longest Common Sequence)。比如字符串1:BDCABA;字符串2:ABCBDAB。則這兩個(gè)字符串的最長(zhǎng)公共子序列長(zhǎng)度為4,最長(zhǎng)公共子序列是:BCBA

二、算法求解

這是一個(gè)動(dòng)態(tài)規(guī)劃的題目。對(duì)于可用動(dòng)態(tài)規(guī)劃求解的問題,一般有兩個(gè)特征:①最優(yōu)子結(jié)構(gòu);②重疊子問題

①最優(yōu)子結(jié)構(gòu)

設(shè)X=(x1,x2,...,xn)和Y=(y1,y2,...,ym)是兩個(gè)序列,將X和Y的最長(zhǎng)公共子序列記為L(zhǎng)CS(X,Y)

找出LCS(X,Y)就是一個(gè)最優(yōu)化問題。因?yàn)椋覀冃枰业絏和Y中最長(zhǎng)的那個(gè)公共子序列。而要找X和Y的LCS,首先考慮X的最后一個(gè)元素和Y的最后一個(gè)元素。

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

LCS(Xn-1,Ym-1)就是原問題的一個(gè)子問題。為什么叫子問題?因?yàn)樗囊?guī)模比原問題小。

為什么是最優(yōu)的子問題?因?yàn)槲覀円业氖荴n-1和Ym-1的最長(zhǎng)公共子序列啊。最長(zhǎng)的!換句話說就是最優(yōu)的那個(gè)。

⑵如果xn!=ym,這下要麻煩一點(diǎn),因?yàn)樗a(chǎn)生了兩個(gè)子問題:LCS(Xn-1,Ym)和LCS(Xn,Ym-1)

因?yàn)樾蛄蠿和序列Y的最后一個(gè)元素不相等,那說明最后一個(gè)元素不可能是最長(zhǎng)公共子序列中的元素。

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

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

求解上面兩個(gè)子問題,得到的公共子序列誰最長(zhǎng),那誰就是LCS(X,Y)。用數(shù)學(xué)表示就是:

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

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

②重疊子問題

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

原問題是:LCS(X,Y)。子問題有❶LCS(Xn-1,Ym-1)❷ LCS(Xn-1,Ym)❸ LCS(Xn,Ym-1)

乍一看,這三個(gè)問題是不重疊的。可本質(zhì)上它們是重疊的,因?yàn)樗鼈冎恢丿B了一大部分。舉例:

第二個(gè)子問題:LCS(Xn-1,Ym)就包含了問題❶LCS(Xn-1,Ym-1),為什么?

因?yàn)椋?dāng)Xn-1和Ym的最后一個(gè)元素不相同時(shí),我們又需要將LCS(Xn-1,Ym-1)進(jìn)行分解:分解成:LCS(Xn-1,Ym-1)和LCS(Xn-2,Ym)

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

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

那么問題來了,如果用遞歸求解,有指數(shù)級(jí)個(gè)子問題,故時(shí)間復(fù)雜度是指數(shù)級(jí)的。這指數(shù)級(jí)個(gè)子問題,難道用了動(dòng)態(tài)規(guī)劃,就變成多項(xiàng)式時(shí)間了??

關(guān)鍵是采用動(dòng)態(tài)規(guī)劃時(shí),并不需要去一一計(jì)算那些重疊了的子問題。或者說:用了動(dòng)態(tài)規(guī)劃之后,有些子問題是通過“查表”直接得到的,而不是重新又計(jì)算一遍得到的。舉個(gè)例子:比如求Fib數(shù)列。

Python求兩個(gè)字符串最長(zhǎng)公共子序列代碼實(shí)例

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

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

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

Python求兩個(gè)字符串最長(zhǎng)公共子序列代碼實(shí)例

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

三、LCS Python代碼實(shí)現(xiàn)

#! /usr/bin/env python3# -*- coding:utf-8 -*-# Author : mayi# Blog : http://www.cnblogs.com/mayi0312/# Date : 2019/5/16# Name : test03# Software : PyCharm# Note : 用于實(shí)現(xiàn)求解兩個(gè)字符串的最長(zhǎng)公共子序列def longestCommonSequence(str_one, str_two, case_sensitive=True): ''' str_one 和 str_two 的最長(zhǎng)公共子序列 :param str_one: 字符串1 :param str_two: 字符串2(正確結(jié)果) :param case_sensitive: 比較時(shí)是否區(qū)分大小寫,默認(rèn)區(qū)分大小寫 :return: 最長(zhǎng)公共子序列的長(zhǎng)度 ''' len_str1 = len(str_one) len_str2 = len(str_two) # 定義一個(gè)列表來保存最長(zhǎng)公共子序列的長(zhǎng)度,并初始化 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' # 計(jì)算最長(zhǎng)公共子序列的長(zhǎng)度 res = longestCommonSequence(s1, s2) # 打印結(jié)果 print(res) # 4

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 免费观看黄色毛片 | 猫咪人成免费网站在线观看 | 娇喘呻吟福利视频在线观看 | 欧美特黄一免在线观看 | 青青久久精品国产免费看 | 亚洲国产综合久久精品 | 国产国产人免费人成免费视频 | 国产成人精品综合久久久软件 | 久久综合久久精品 | 7m凹凸国产刺激在线视频 | 国产精品嫩草影院在线播放 | 国产三级黄色片 | 99国产精品九九视频免费看 | 91刘亦菲精品福利在线 | 黄网免费看 | 久久精品中文字幕久久 | 亚洲午夜精品久久久久久成年 | 亚洲欧洲精品国产二码 | 日本乱人伦片中文字幕三区 | 亚洲国产精品网 | 欧美a级黄色大片 | 国产高清美女一级a毛片久久w | 91精品免费观看 | 日韩亚洲影院 | 最新孕交videosgratis | 久久996re热这里只有精品 | 黄色成人毛片 | 亚洲人成一区二区三区 | 国产高清自拍视频 | 色婷婷亚洲十月十月色天 | 超级碰碰碰免费视频播放 | 毛片一级片 | 日韩欧美91 | 九九爱www高清免费人成 | 久草视频福利在线观看 | 中国麻豆 | 欧美成人亚洲综合精品欧美激情 | 欧美一区二区三区免费播放 | 中文字幕日韩一区二区三区不卡 | 欧美毛片aaa激情 | 成人www |