1. 程式人生 > >用python實現最長公共子序列演算法(找到所有最長公共子串)

用python實現最長公共子序列演算法(找到所有最長公共子串)

軟體安全的一個小實驗,正好複習一下LCS的寫法。

實現LCS的演算法和演算法導論上的方式基本一致,都是先建好兩個表,一個儲存在(i,j)處當前最長公共子序列長度,另一個儲存在(i,j)處的回溯方向。

相對於演算法導論的版本,增加了一個多分支回溯,即儲存回溯方向時出現了向上向左都可以的情況時,這時候就代表可能有多個最長公共子序列。當回溯到這裡時,讓程式帶著儲存已經回溯的字串的棧進行遞迴求解,當走到左上角的時候輸出出來

# coding=utf-8

class LCS():
    def input(self, x, y):
    #讀入待匹配的兩個字串
        if type(x) != str or type(y) != str:
            print 'input error'
            return None
        self.x = x
        self.y = y

    def Compute_LCS(self):
        xlength = len(self.x)
        ylength = len(self.y)
        self.direction_list = [None] * xlength #這個二維列表存著回溯方向
        for i in xrange(xlength):
            self.direction_list[i] = [None] * ylength
        self.lcslength_list = [None] * (xlength + 1)      
        #這個二維列表存著當前最長公共子序列長度
        for j in xrange(xlength + 1):
            self.lcslength_list[j] = [None] * (ylength + 1)

        for i in xrange(0, xlength + 1):
            self.lcslength_list[i][0] = 0
        for j in xrange(0, ylength + 1):
            self.lcslength_list[0][j] = 0
        #下面是進行回溯方向和長度表的賦值
        for i in xrange(1, xlength + 1):
            for j in xrange(1, ylength + 1):
                if self.x[i - 1] == self.y[j - 1]:
                    self.lcslength_list[i][j] = self.lcslength_list[i - 1][j - 1] + 1
                    self.direction_list[i - 1][j - 1] = 0  # 左上
                elif self.lcslength_list[i - 1][j] > self.lcslength_list[i][j - 1]:
                    self.lcslength_list[i][j] = self.lcslength_list[i - 1][j]
                    self.direction_list[i - 1][j - 1] = 1  # 上
                elif self.lcslength_list[i - 1][j] < self.lcslength_list[i][j - 1]:
                    self.lcslength_list[i][j] = self.lcslength_list[i][j - 1]
                    self.direction_list[i - 1][j - 1] = -1  # 左
                else:
                    self.lcslength_list[i][j] = self.lcslength_list[i - 1][j]
                    self.direction_list[i - 1][j - 1] = 2  # 左或上
        self.lcslength = self.lcslength_list[-1][-1]
        return self.direction_list, self.lcslength_list

    def printLCS(self, curlen, i, j, s):
        if i == 0 or j == 0:
            return None

        if self.direction_list[i - 1][j - 1] == 0:
            if curlen == self.lcslength:
                s += self.x[i - 1]
                for i in range(len(s)-1,-1,-1):
                    print s[i],
                print '\n'
            elif curlen < self.lcslength:
                s += self.x[i-1]
                self.printLCS(curlen + 1, i - 1, j - 1, s)
        elif self.direction_list[i - 1][j - 1] == 1:
            self.printLCS(curlen,i - 1, j,s)
        elif self.direction_list[i - 1][j - 1] == -1:
            self.printLCS(curlen,i, j - 1,s)
        else:
            self.printLCS(curlen,i - 1, j,s)
            self.printLCS(curlen,i, j - 1,s)


    def returnLCS(self):
        #回溯的入口
        self.printLCS(1,len(self.x), len(self.y),'')


if __name__ == '__main__':
    p = LCS()
    p.input('abcbdab', 'bdcaba')
    p.Compute_LCS()
    p.returnLCS()

在對'abcbdab'和'bdcaba'兩個串用LCS後,得到下面結果:

image

相關推薦

python實現公共序列演算法(找到所有公共)

軟體安全的一個小實驗,正好複習一下LCS的寫法。 實現LCS的演算法和演算法導論上的方式基本一致,都是先建好兩個表,一個儲存在(i,j)處當前最長公共子序列長度,另一個儲存在(i,j)處的回溯方向。 相對於演算法導論的版本,增加了一個多分支回溯,即儲存回溯方向時出現了向上向左都可以的情況時,這時候就代表可能

python實現Longest Common Subsequence公共序列演算法

    最長公共子序列是很基本的演算法,只是最近用到了就又拿來學習一下,網上有很多很多的Java版本的,的確寫的也很不錯,思想都很好,大致上分為三種: 1.基於遞迴的思想 2.基於動態規劃的思想 3.基於HashMap的動態規劃     在這裡我使用的是python來實現,

公共序列(LCS)問題(連續序列)的三種解法

最長公共子序列(LCS)問題有兩種方式定義子序列,一種是子序列不要求不連續,一種是子序列必須連續。上一章介紹了用兩種演算法解決子序列不要求連續的最終公共子序列問題,本章將介紹要求子序列必須是連續的情況下如何用演算法解決最長公共子序列問題。         仍以上一章的兩個

UVa 11404 回文序列(LCS求回文長度)

ring vector 通過 spa include map 它的 思想 cstring https://vjudge.net/problem/UVA-11404 題意: 給定一個由小寫字母組成的字符串,刪除其中的0個或多個字符,使得剩下的字母(順序不變)組成一個盡量長

Python之Suds庫調WCF實現復雜參數序列

rtu keyvalue microsoft ets tex sse exceptio https aps 今年主要做自動化測技術支持工作,最近一直在做接口自動化這塊,前些天在研究將web頁面模擬http進行接口自動化,這周杭州那邊想測試WCF服務,所以這兩天一直在探索。遇

hdu 1257(從下降序列求解轉化為上升序列求解)

某國為了防禦敵國的導彈襲擊,發展出一種導彈攔截系統.但是這種導彈攔截系統有一個缺陷:雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能超過前一發的高度.某天,雷達捕捉到敵國的導彈來襲.由於該系統還在試用階段,所以只有一套系統,因此有可能不能攔截所有的導彈. 怎麼

8種方法Python實現線性迴歸,為你解析高效選擇

來源:大資料文摘編譯:丁慧、katherine Hou、錢天培作者:TirthajyotiSar

Python實現簡單的文字識別:基於百度雲文字識別API

Python版本:3.6.5 百度雲提供的文字識別技術,準確率還是非常高的,而且每天還有5w次免費的呼叫量,對於用來學習或者偶爾拿來用用,已經完全足夠了。文章提供一個模板,稍加修改就可以直接套用。註釋中提到必須輸入的地方,你都正確地輸入了的話,就可以完成一次簡單的文字識別了

機器學習---python實現小二乘線性回歸並用隨機梯度下降法求解 (Machine Learning Least Squares Linear Regression Application SGD)

lin python get stat linspace oms mach 實現 all 在《機器學習---線性回歸(Machine Learning Linear Regression)》一文中,我們主要介紹了最小二乘線性回歸模型以及簡單地介紹了梯度下降法。現在,讓我們來

python實現對元素的截圖

一.目標 瀏覽網頁的時候,看見哪個元素,就能擷取哪個元素當圖片,不管那個元素有多長   二.所用工具和第三方庫 python ,PIL,selenium pycharm 三.程式碼部分 長截圖整體思路: 1.獲取元素 2.移動,截圖,移動,截圖,直到抵達元素的底部 3.把截圖按照元素所在位置切割,

實現基於股票收盤價的時間序列的統計(Python實現

    時間序列是按時間順序的一組真實的數字,比如股票的交易資料。通過分析時間序列,能挖掘出這組序列背後包含的規律,從而有效地預測未來的資料。在這部分裡,將講述基於時間序列的常用統計方法。 1 用rolling方法計算移動平均值     當時間序列的樣本數波動

python實現LBP特征點計算

i+1 [0 code read cvt lena 實現 ims numpy 1 import cv2 2 import numpy as np 3 4 5 def olbp(src): 6 dst = np.zeros(src.shape,dty

21-城裏人套路深之python實現邏輯回歸算法

rom 成功 基礎知識 壓力 dvp ilb nbsp html 感覺 如果和一個人交流時,他的思想像彈幕一樣飄散在空中,將是怎樣的一種景象?我想大概會毫不猶豫的點關閉的。生活為啥不能簡單明了?因為太直白了令人乏味。保留一些不確定性反而撲朔迷離,引人入勝。我們學習了線性回歸

python實現歸並排序

想是 一個 pass 列合並 cnblogs plist post 思想 str def merge(lfrom, lto, low, mid, high): i, j, k = low, mid, low while i < mid and j &l

python實現一個命令行文本編輯器

screen alt 保存 模型 既然 ffffff 圖片 單行 pda “這看起來相當愚蠢”——題記   不過我整個人都很荒誕,何妨呢?貼一張目前的效果圖   看起來很舒服,不是麽?即使一切都是個幌子:光標只能在最後,按一下上下左右就會退出,一行超出75個字符

python實現銀行轉賬功能

賬號 pytho exec llb 賬戶 密碼 rollback money 輸入數據 #coding:utf-8 import MySQLdb #調用MySQL數據庫模塊 conn=MySQLdb.Connect( host='.........

Python 實現武科大教務處自動搶課

kit overflow 簡單的 pos request 直接 sts itl head 首先分析網頁,找到教務處登錄的驗證碼 然後用 Python 直接把驗證碼下載到本地(整個程序通過 requests 庫實現): def GetRandCode(): url

Python實現一個大數據搜索及源代碼

Python編程語言 Python案例講解 Python基礎精講 在日常生活中,大家了解搜索引擎如百度、360、搜狗、谷歌等,搜索是大數據領域裏常見的需求。Splunk和ELK分別是該領域在非開源和開源領域裏的領導者。本文利用很少的Python代碼實現了一個基本的數據搜索功能,試圖讓大家理解大數據

Python實現Excel的讀寫

github exc orm pytho sheet bin blog light int 一、讀excel文件的簡單示例 #!/usr/bin/env python # -*- coding:utf-8 -*- import xlrd from xlrd.bo

資深程序員Python實現數據驅動的接口自動化測試!

AS 自動 示例 AC adding get json face 內容 2. 方案 針對上面的API,在做接口測試時,需要的測試用例動輒會多達10+, 這個時候采用數據驅動的方式將共性的內容寫入配置文件或許會更合適。 這裏考慮把API、參數、以及預期結果預行在格式化的CS