演算法實驗報告2——最長公共子序列——2020.12.17
阿新 • • 發佈:2020-12-21
技術標籤: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])