# 最長公共子串行問題
# 作用:求兩個序列的最長公共子串行
# 輸入:兩個字串陣列:a和b
# 輸出:最長公共子串行的長度和序列
deflcs(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)
(l[x])
print('
\n');print('
公共子串行長度二維表:
(l)
print('
\n');print('
公共子串行長度步進表:
');print (c);print('\n'
)
return l[n][m],c,n,m
其中返回的 l[n][m] 就是最長公共子串行的長度,以下列印序列:
defprintlcs(c,a,x,y):
if ( x == 0 or y ==0):
return
0
if c[x][y] ==0:
printlcs(c,a,x-1,y-1)
(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...