最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

一、問題描述

給定兩個(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)?,我們需要找到X和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ì)算那些重疊了的子問題?;蛘哒f:用了動(dòng)態(tài)規(guī)劃之后,有些子問題是通過“查表”直接得到的,而不是重新又計(jì)算一遍得到的。舉個(gè)例子:比如求Fib數(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)公共子序列的遞歸式才完整。

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í)有所幫助,也希望大家多多支持腳本之家。

  • NumPy數(shù)組排序、過濾與隨機(jī)數(shù)生成詳解

    NumPy數(shù)組排序、過濾與隨機(jī)數(shù)生成詳解

    這篇文章主要詳細(xì)給大家介紹了NumPy數(shù)組排序、過濾與隨機(jī)數(shù)生成,文中通過代碼示例給大家講解的非常詳細(xì),對(duì)大家學(xué)習(xí)NumPy有一定的幫助,需要的朋友可以參考下
    2024-05-05
  • 關(guān)于Gradio中Button用法及事件監(jiān)聽器click方法使用

    關(guān)于Gradio中Button用法及事件監(jiān)聽器click方法使用

    介紹了在Gradio中使用Button組件和事件監(jiān)聽器的click方法,通過一個(gè)簡(jiǎn)單的示例展示了如何實(shí)現(xiàn)點(diǎn)擊按鈕輸出一行文字的功能,在實(shí)際項(xiàng)目中遇到了一個(gè)錯(cuò)誤,經(jīng)過排查和請(qǐng)教室友后,發(fā)現(xiàn)問題出在inputs參數(shù)的傳遞上,需要傳入一個(gè)包含輸入組件的列表
    2024-11-11
  • python編寫簡(jiǎn)單端口掃描器

    python編寫簡(jiǎn)單端口掃描器

    這篇文章主要為大家詳細(xì)介紹了python編寫簡(jiǎn)單端口掃描器,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • Python遞歸及尾遞歸優(yōu)化操作實(shí)例分析

    Python遞歸及尾遞歸優(yōu)化操作實(shí)例分析

    這篇文章主要介紹了Python遞歸及尾遞歸優(yōu)化操作,結(jié)合實(shí)例形式分析了Python遞歸及尾遞歸優(yōu)化相關(guān)概念、原理、應(yīng)用與操作技巧,需要的朋友可以參考下
    2020-02-02
  • Python自動(dòng)化處理Excel數(shù)據(jù)的操作過程

    Python自動(dòng)化處理Excel數(shù)據(jù)的操作過程

    在實(shí)際數(shù)據(jù)處理和分析過程中,經(jīng)常會(huì)遇到需要從大量數(shù)據(jù)中提取出特定日期范圍內(nèi)的信息的需求,本文將介紹如何使用Python的pandas庫(kù)來處理Excel文件,感興趣的朋友跟隨小編一起看看吧
    2023-11-11
  • 詳解Python的Django框架中的templates設(shè)置

    詳解Python的Django框架中的templates設(shè)置

    這篇文章主要介紹了Python的Django框架中的TEMPLATES設(shè)置,主要講述了Django1.8版本后的一些新特性,需要的朋友可以參考下
    2015-05-05
  • Python程序中引用環(huán)境變量的方法實(shí)現(xiàn)

    Python程序中引用環(huán)境變量的方法實(shí)現(xiàn)

    本文主要介紹了Python程序中引用環(huán)境變量的方法實(shí)現(xiàn),通過配置環(huán)境變量并在代碼中引用,可以避免將敏感信息直接寫入代碼中,感興趣的可以了解一下
    2024-12-12
  • 一篇文章帶你學(xué)習(xí)Python3的高級(jí)特性(1)

    一篇文章帶你學(xué)習(xí)Python3的高級(jí)特性(1)

    這篇文章主要為大家詳細(xì)介紹了Python3的高階函數(shù),主要介紹什么是高級(jí)特性,高級(jí)特性的用法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • 最新評(píng)論

    兴安盟| 任丘市| 盐源县| 庄河市| 辉县市| 拜城县| 山阳县| 黑河市| 安国市| 佛学| 托克逊县| 河西区| 哈密市| 大新县| 吴川市| 望江县| 长阳| 万源市| 武义县| 大宁县| 石屏县| 海盐县| 古交市| 龙川县| 漳州市| 那曲县| 天长市| 西盟| 华安县| 台中市| 泉州市| 云南省| 肇源县| 宝兴县| 垣曲县| 三门峡市| 泰来县| 西林县| 达尔| 伊金霍洛旗| 临海市|