最長非連続公共サブストリップアルゴリズムLCSを求めて
pythonは最長の非連続公共サブストリングアルゴリズムLCSを求めます.
動的計画は、最長の非連続的な公共サブストリングアルゴリズムLCS参照アルゴリズムURL:http://blog.chinaunix.net/u1/35100/showart_415862.エントリ:2つの比較すべきシリアルS 1、S 2のリターン:最長の非連続的な共通サブストリングS
--結果---
bcabd
from:http://hi.baidu.com/jxq61/item/644aaf0d903b84e0f55ba68f
動的計画は、最長の非連続的な公共サブストリングアルゴリズムLCS参照アルゴリズムURL:http://blog.chinaunix.net/u1/35100/showart_415862.エントリ:2つの比較すべきシリアルS 1、S 2のリターン:最長の非連続的な共通サブストリングS
#coding=gbk
#
class TEMT:
L,IX1,IX2 =0,0,0
def WLCS( s1,s2 ):
n1 = len( s1 )
n2 = len( s2 )
if n1==0 or n2==0:
return ""
MM = [ [ TEMT() for j in range(0,n2 ) ] for I in range(0,n1 ) ]
if s1[0] == s2[0]:
MM[0][0].L = 1
MM[0][0].IX1 = 0
MM[0][0].IX2 = 0
else:
MM[0][0].L = 0
MM[0][0].IX1 = 0
MM[0][0].IX2 = 0
for I in range(1,n1 ):
MM[I][0].L = MM[I-1][0].L
MM[I][0].IX1 = MM[I-1][0].IX1
MM[I][0].IX2 = 0
if s2[0] == s1[I]:
MM[I][0].L = 1
if MM[I-1][0].L == 0 :
MM[I][0].IX1 = I
for I in range(1,n2 ):
MM[0][I].L = MM[0][I-1].L
MM[0][I].IX2 = MM[0][I-1].IX2
MM[0][I].IX1 = 0
if s2[I] == s1[0]:
MM[0][I].L = 1
if MM[0][I-1].L == 0 :
MM[0][I].IX2 = I
for I in range(1,n1):
for J in range(1,n2):
if s1[I] ==s2[J] :
MM[I][J].L = MM[I-1][J-1].L + 1;
MM[I][J].IX1 = I;
MM[I][J].IX2 = J;
elif (MM[I-1][J].L>MM[I][J-1].L):
MM[I][J].L = MM[I-1][J].L;
MM[I][J].IX1 = MM[I-1][J].IX1;
MM[I][J].IX2 = MM[I-1][J].IX2;
else:
MM[I][J].L = MM[I][J-1].L;
MM[I][J].IX1 = MM[I][J-1].IX1;
MM[I][J].IX2 = MM[I][J-1].IX2;
I = n1-1; J = n2-1
LP = MM[I][J].L;
if LP==0:
return ""
S = [ "0" ] * LP
K = LP
while (I>=0) and (J>=0) :
LP = MM[I][J].L;
if LP>0 :
if s1[I]==s2[J]:
K = K -1
S[K] = s1[I];
I =I-1; J = J-1;
else:
K1 = MM[I][J].IX1;
K2 = MM[I][J].IX2;
I =K1; J =K2;
else :
break;
return "".join(S)
s1 ='abcdabd';
s2 ='b666cjabkkkd';
print( WLCS(s1,s2) )
--結果---
bcabd
from:http://hi.baidu.com/jxq61/item/644aaf0d903b84e0f55ba68f