Python最长公共子串算法实例
本文实例讲述了Python最长公共子串算法。分享给大家供大家参考。具体如下:
#!/usr/bin/envpython
#findanLCS(LongestCommonSubsequence).
#*publicdomain*
deffind_lcs_len(s1,s2):
m=[[0forxins2]foryins1]
forp1inrange(len(s1)):
forp2inrange(len(s2)):
ifs1[p1]==s2[p2]:
ifp1==0orp2==0:
m[p1][p2]=1
else:
m[p1][p2]=m[p1-1][p2-1]+1
elifm[p1-1][p2]<m[p1][p2-1]:
m[p1][p2]=m[p1][p2-1]
else:#m[p1][p2-1]<m[p1-1][p2]
m[p1][p2]=m[p1-1][p2]
returnm[-1][-1]
deffind_lcs(s1,s2):
#lengthtable:everyelementissettozero.
m=[[0forxins2]foryins1]
#directiontable:1stbitforp1,2ndbitforp2.
d=[[Noneforxins2]foryins1]
#wedon'thavetocareaboutthebounderycheck.
#anegativeindexalwaysgivesanintactzero.
forp1inrange(len(s1)):
forp2inrange(len(s2)):
ifs1[p1]==s2[p2]:
ifp1==0orp2==0:
m[p1][p2]=1
else:
m[p1][p2]=m[p1-1][p2-1]+1
d[p1][p2]=3#11:decr.p1andp2
elifm[p1-1][p2]<m[p1][p2-1]:
m[p1][p2]=m[p1][p2-1]
d[p1][p2]=2#10:decr.p2only
else:#m[p1][p2-1]<m[p1-1][p2]
m[p1][p2]=m[p1-1][p2]
d[p1][p2]=1#01:decr.p1only
(p1,p2)=(len(s1)-1,len(s2)-1)
#nowwetraversethetableinreverseorder.
s=[]
while1:
printp1,p2
c=d[p1][p2]
ifc==3:s.append(s1[p1])
ifnot((p1orp2)andm[p1][p2]):break
ifc&2:p2-=1
ifc&1:p1-=1
s.reverse()
return''.join(s)
if__name__=='__main__':
printfind_lcs('abcoisjf','axbaoeijf')
printfind_lcs_len('abcoisjf','axbaoeijf')
希望本文所述对大家的Python程序设计有所帮助。
热门推荐
10 医院探望朋友祝福语简短
11 毕业祝福语简短女朋友
12 春节虎年爸妈祝福语简短
13 儿童毕业祝福语 简短6
14 开工仪式横幅祝福语简短
15 孩子日常祝福语大全简短
16 清晨寄语诗句祝福语简短
17 结婚送亲认亲祝福语简短
18 虎年喝酒拜年祝福语简短