最長公共子串行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...