python實現最長公共子串行

2022-10-04 19:36:15 字數 1556 閱讀 3186

最長公共子串行python實現,最長公共子串行是動態規劃基本題目,下面按照動態規劃基本步驟解出來。

1.找出最優解的性質,並刻劃其結構特徵

序列a共有m個元素,序列b共有n個元素,如果a[m-1]==b[n-1],那麼a[:m]和b[:n]的最長公共子串行長度就是a[:m-1]和b[:n-1]的最長公共子串行長度+1doxmemk;如果a[m-1]!=b[n-1],那麼a[:m]和b[:n]的最長公共子串行長度就是max(a[:m-1]和b[:n]的最長公共子串行長度,a[:m]和b[:n-1]的最長公共子串行長度)。

2.遞迴定義最優值

3.以自底向上大方式計算出最優值

python**如下:

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 idoxmemkn 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=www.cppcns.com=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)

a='abcbdab'

b='bdcaba'

c,flag=lcs(a,b)

for i in c:

print(i)

print('')

for j in flag:

print(j)

print('')

printlcs(flag,a,len(a),len(b))

print('')

執行結果輸出如下:

4.根據計算最優值得到的資訊,構造最優解

上圖是執行結果,第乙個矩陣是計算公共子串行長度的,可以看到最長是4;第二個矩陣是構造這個最優解用的;最後輸出乙個最優解bcba。

本文標題: python實現最長公共子串行

本文位址:

最長公共子串行python實現

最長公共子串行是動態規劃基本題目,下面按照動態規劃基本步驟解出來。序列a共有m個元素,序列b共有n個元素,如果a m 1 b n 1 那麼a m 和b n 的最長公共子串行長度就是a m 1 和b n 1 的最長公共子串行長度 1 如果a m 1 b n 1 那麼a m 和b n 的最長公共子串行長...

最長公共子串行python實現

1 dp基本思路 公共子串行最優子結構 將問題分解表成更簡單的子問題,這個子問題可以分解成更多的子問題使用動態規劃演算法求解,這個過程需要在乙個表中儲存同一級別的子問題的解,因此這個解可以被更高階的子問題使用。2 問題的解 定義兩個序列x y,二維陣列f i j 表示x的i位和y的j位之前的最長公共...

python 最長公共子串行

usr bin env python3 coding utf 8 最長公共子串行 fish fosh fsh def findlongestsubstring source,dest 輸入值,要比較的值 inlen len source outlen len dest target cell 0 f...