最長公共子串行問題(LCS) Python實現

2022-09-09 10:21:11 字數 2444 閱讀 5704

# 最長公共子串行問題

# 作用:求兩個序列的最長公共子串行

# 輸入:兩個字串陣列:a和b

# 輸出:最長公共子串行的長度和序列

def

lcs(a,b):

print('

輸入字串陣列a

',a)

print('

輸入字串陣列b

',b);print('\n'

) n =len(a)

m =len(b)

#在字串陣列a、b之前插入字元0,目的是使後面下標統一

a.insert(0,'0'

) b.insert(0,'0

')#二維表l存放公共子串行的長度

l = [ ([0]*(m+1)) for i in range(n+1) ]

#二維表c存放公共子串行的長度步進

c = [ ([0]*(m+1)) for i in range(n+1) ]

for x in range (0,n+1):

for y in range (0,m+1):

if (x==0 or y==0):

l[x][y] =0

elif a[x] ==b[y]:

l[x][y] = ( l[x-1][y-1] + 1)

c[x][y] =0

elif l[x-1][y] >= l[x][y-1]:

l[x][y] = l[x-1][y]

c[x][y] = 1

else

: l[x][y] = l[x][y-1]

c[x][y] = -1

print('

二維錶行標:

',x)

print

(l[x])

print('

\n');print('

公共子串行長度二維表:

');print

(l)

print('

\n');print('

公共子串行長度步進表:

');print (c);print('\n'

)

return l[n][m],c,n,m

其中返回的 l[n][m] 就是最長公共子串行的長度,以下列印序列:

def

printlcs(c,a,x,y):

if ( x == 0 or y ==0):

return

0

if c[x][y] ==0:

printlcs(c,a,x-1,y-1)

print

(a[x])

elif c[x][y] == 1:

printlcs(c,a,x-1,y)

else

: printlcs(c,a,x,y-1)

輸入字串陣列a、b並進行函式呼叫:

a = ['

z', '

x', '

y', '

x', '

y', 'z'

]b = ['

x', '

y', '

y', '

z', 'x'

]length,c,x,y =lcs(a,b)

print('

最長公共子串行長度為:

',length)

print('

最長公共子串行為:')

printlcs(c,a,x,y)

執行結果:

二維錶行標: 0

[0, 0, 0, 0, 0, 0]

二維錶行標: 1[0, 0, 0, 0, 1, 1]

二維錶行標: 2[0, 1, 1, 1, 1, 2]

二維錶行標: 3[0, 1, 2, 2, 2, 2]

二維錶行標: 4[0, 1, 2, 2, 2, 3]

二維錶行標: 5[0, 1, 2, 3, 3, 3]

二維錶行標: 6[0, 1, 2, 3, 4, 4]

公共子串行長度二維表:

[[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 1, 1], [0, 1, 1, 1, 1, 2], [0, 1, 2, 2, 2, 2], [0, 1, 2, 2, 2, 3], [0, 1, 2, 3, 3, 3], [0, 1, 2, 3, 4, 4]]

公共子串行長度步進表:

[[0, 0, 0, 0, 0, 0], [0, 1, 1, 1, 0, -1], [0, 0, -1, -1, 1, 0], [0, 1, 0, 0, -1, 1], [0, 0, 1, 1, 1, 0], [0, 1, 0, 0, -1, 1], [0, 1, 1, 1, 0, -1]]

最長公共子串行長度為: 4最長公共子串行為:xy

yz

最長公共子串行問題

給定整數a1,a2,an 可能有負值 求連續子串行和的最大值。為方便起見,如果所有整數都為負值,則最大子串行和為0 這是個顯而易見的方法,幾乎每個人在第一眼看到該問題都能夠想出來的方法。就是將所有的子串行找出來,然後求和最大的乙個。如果序列足夠大,該方法的效率可想而知。如下 include incl...

最長公共子串行問題

最長公共子串行問題很早就在很多論壇上見過,前幾天看到乙個人發了一篇帖子,心血來潮就去看演算法導論上的動態規劃部分,關於這個問題不再細述,直接貼c 實現的具體 了。做大公共子串行問題 pragma once include using std string define over 1 書中使用箭頭符號...

最長公共子串行問題

問題描述 字串行的子串行是指從給定字串行中隨意地 不一定連續 去掉若干個字元 可能乙個也不去掉 後所形成的字串行。令給定的字串行x x0,x1,xm 1 序列y y0,y1,yk 1 是x的子串行,存在x的乙個嚴格遞增下標序列,使得對所有的j 0,1,k 1,有xij yj。例如,x abcbdab...