1. 程式人生 > 其它 >演算法實驗報告2——最長公共子序列——2020.12.17

演算法實驗報告2——最長公共子序列——2020.12.17

技術標籤:python演算法-每日一練演算法python資料結構leetcode列表

演算法實驗報告2——最長公共子序列

一丶最長公共子序列問題

設有兩個序列X=(x1,x2,…,x7)=(a,b,c,b,d,a,b)和Y=(y1,y2,…,y6)=(b,d,c,a,b,a)。求它們的最長公共子序列。

二丶最長公共子序列程式碼

# coding=gbk
__author__ = 'Blockchain_Key'
__time__ = '2020.12.17'

def lcs
(a, b): # 求字串長度 lena = len(a) lenb = len(b) # 建立動態規劃表 c = [[0 for i in range(lenb + 1)] for j in range(lena + 1)] # 建立動態轉化表 flag = [[0 for i in range(lenb + 1)] for j in range(lena + 1)] # 遍歷處理資料 for i in range(lena): for j in range(lenb): if a[i]
== b[j]: c[i + 1][j + 1] = c[i][j] + 1 flag[i + 1][j + 1] = 'ok' # 判定標識 elif c[i + 1][j] > c[i][j + 1]: c[i + 1][j + 1] = c[i + 1][j] flag[i + 1][j + 1] = 'left' # 判定標識 else: c[i + 1][j + 1]
= c[i][j + 1] flag[i + 1][j + 1] = 'up' # 判定標識 # 返回資料 return c, flag # 列印公共子序列 def printLcs(flag, a, i, j): if i == 0 or j == 0: return if flag[i][j] == 'ok': printLcs(flag, a, i - 1, j - 1) print(a[i - 1], end='') elif flag[i][j] == 'left': printLcs(flag, a, i, j - 1) else: printLcs(flag, a, i - 1, j) if __name__ == "__main__": a = 'abcddab' b = 'bdcaba' c, flag = lcs(a, b) print('最長公共子序列為:', end='') printLcs(flag, a, len(a), len(b)) print() print('最長公共子序列長度為:', end='') print(c[len(c) - 1][len(c[len(c) - 1]) - 1])

三丶執行結果

在這裡插入圖片描述

——虎鼓瑟兮鸞回車,仙之人兮列如麻——