亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時(shí)間:2020年03月05日 11:01:00   作者:騎著螞蟻流浪  
這篇文章主要介紹了Python求兩個(gè)字符串最長(zhǎng)公共子序列代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

一、問(wèn)題描述

給定兩個(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ī)劃求解的問(wèn)題,一般有兩個(gè)特征:①最優(yōu)子結(jié)構(gòu);②重疊子問(wèn)題

①最優(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)化問(wèn)題。因?yàn)?,我們需要找到X和Y中最長(zhǎng)的那個(gè)公共子序列。而要找X和Y的LCS,首先考慮X的最后一個(gè)元素和Y的最后一個(gè)元素。

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

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

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

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

因?yàn)樾蛄蠿和序列Y的最后一個(gè)元素不相等,那說(shuō)明最后一個(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è)子問(wèn)題,得到的公共子序列誰(shuí)最長(zhǎng),那誰(shuí)就是LCS(X,Y)。用數(shù)學(xué)表示就是:

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

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

②重疊子問(wèn)題

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

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

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

第二個(gè)子問(wèn)題:LCS(Xn-1,Ym)就包含了問(wèn)題❶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)

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

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

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

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

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

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

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

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ū)分大小寫(xiě),默認(rèn)區(qū)分大小寫(xiě)
  :return: 最長(zhǎng)公共子序列的長(zhǎng)度
  """
  len_str1 = len(str_one)
  len_str2 = len(str_two)
  # 定義一個(gè)列表來(lái)保存最長(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í)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python readline()和readlines()函數(shù)實(shí)現(xiàn)按行讀取文件

    Python readline()和readlines()函數(shù)實(shí)現(xiàn)按行讀取文件

    本文主要介紹了Python readline()和readlines()函數(shù)實(shí)現(xiàn)按行讀取文件,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • Python中pycharm編輯器界面風(fēng)格修改方法

    Python中pycharm編輯器界面風(fēng)格修改方法

    這篇文章主要介紹了Python中pycharm編輯器界面風(fēng)格修改方法,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • 分享python數(shù)據(jù)統(tǒng)計(jì)的一些小技巧

    分享python數(shù)據(jù)統(tǒng)計(jì)的一些小技巧

    今天這些小技巧在處理python的一些數(shù)據(jù)方面還是很有幫助的,希望能幫到在這方面有需要的童鞋~
    2016-07-07
  • keras分類(lèi)模型中的輸入數(shù)據(jù)與標(biāo)簽的維度實(shí)例

    keras分類(lèi)模型中的輸入數(shù)據(jù)與標(biāo)簽的維度實(shí)例

    這篇文章主要介紹了keras分類(lèi)模型中的輸入數(shù)據(jù)與標(biāo)簽的維度實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-07-07
  • Python模擬登錄的多種方法(四種)

    Python模擬登錄的多種方法(四種)

    這篇文章主要介紹了Python模擬登錄的多種方法,大概給大家提供了四種方法,每種方法給大家介紹的都很詳細(xì),感興趣的朋友跟隨腳本之家小編一起看看吧
    2018-06-06
  • 如何使用Python異步之上下文管理器

    如何使用Python異步之上下文管理器

    這篇文章主要為大家介紹了如何使用Python異步之上下文管理器詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • OpenCV3.3+Python3.6實(shí)現(xiàn)圖片高斯模糊

    OpenCV3.3+Python3.6實(shí)現(xiàn)圖片高斯模糊

    這篇文章主要為大家詳細(xì)介紹了OpenCV3.3+Python3.6實(shí)現(xiàn)圖片高斯模糊,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • Django+Ajax異步刷新/定時(shí)自動(dòng)刷新實(shí)例詳解

    Django+Ajax異步刷新/定時(shí)自動(dòng)刷新實(shí)例詳解

    AJAX是前端技術(shù)的集合,包括JavaScript、XML、HTML、CSS等,下面這篇文章主要給大家介紹了關(guān)于Django+Ajax異步刷新/定時(shí)自動(dòng)刷新的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-10-10
  • Python數(shù)字圖像處理基礎(chǔ)直方圖詳解

    Python數(shù)字圖像處理基礎(chǔ)直方圖詳解

    這篇文章主要介紹了Python數(shù)字圖像處理基礎(chǔ)直方圖詳解,本文對(duì)Python直方圖的定義、性質(zhì)、應(yīng)用以及Python直方圖的計(jì)算作了詳細(xì)的講解,有需要朋友可以借鑒參考下
    2021-09-09
  • 使用Python的Zato發(fā)送AMQP消息的教程

    使用Python的Zato發(fā)送AMQP消息的教程

    這篇文章主要介紹了使用Python的Zato發(fā)送AMQP消息的教程,主要是基于一些Zato的圖形化界面進(jìn)行操作,需要的朋友可以參考下
    2015-04-04

最新評(píng)論