三个字符串的LCS

来源:互联网 发布:cocos2d-x用js编写 编辑:程序博客网 时间:2024/05/21 09:46

RT,类比二维的情况,申请一个三维矩阵即可,无非是遍历矩阵时判断的条件多一点而已。

Python代码:

#coding=utf-8import sysdef Matrix(rows,cols,heights):    matrix = [[[0 for height in range(heights+1)]               for col in range(cols+1)]              for row in range(rows+1)]    return matrixdef Mark(rows,cols,heights):    matrix = [[['000' for height in range(heights+1)]               for col in range(cols+1)]              for row in range(rows+1)]    return matrixdef printf(mk,x,i,j,k):    if i==0 or j==0 or k==0:return     if mk[i][j][k]=='111':        printf(mk,x,i-1,j-1,k-1)        sys.stdout.write(x[i-1])    elif mk[i][j][k]=='110':        printf(mk,x,i-1,j-1,k)    elif mk[i][j][k]=='101':        printf(mk,x,i-1,j,k-1)    elif mk[i][j][k]=='100':        printf(mk,x,i-1,j,k)    elif mk[i][j][k]=='011':        printf(mk,x,i,j-1,k-1)    elif mk[i][j][k]=='010':        printf(mk,x,i,j-1,k)    elif mk[i][j][k]=='001':        printf(mk,x,i,j,k-1)while True:    x=raw_input()    y=raw_input()    z=raw_input()    (m,n,w)=(len(x),len(y),len(z))    mat = Matrix(m,n,w)    mk = Mark(m,n,w)    dp =['001','010','011','100','101','110']    for i in range(1,m+1):        for j in range(1,n+1):            for k in range(1,w+1):                #print "i=%d,j=%d,k=%d" %(i,j,k)                if x[i-1]==y[j-1] and y[j-1]==z[k-1]:                    mat[i][j][k]=mat[i-1][j-1][k-1]+1                    mk[i][j][k]='111'                elif x[i-1]==y[j-1] and y[j-1]!=z[k-1]:                    if mat[i][j][k-1]>mat[i-1][j-1][k]:                        mat[i][j][k]=mat[i][j][k-1]                        mk[i][j][k]='001'                    else:                        mat[i][j][k]=mat[i-1][j-1][k]                        mk[i][j][k]='110'                elif x[i-1]==z[k-1] and z[k-1]!=y[j-1]:                    if mat[i][j-1][k]>mat[i-1][j][k-1]:                        mat[i][j][k]=mat[i][j-1][k]                        mk[i][j][k]='010'                    else:                        mat[i][j][k]=mat[i-1][j][k-1]                        mk[i][j][k]='101'                elif y[j-1]==z[k-1] and z[k-1]!=x[i-1]:                    if mat[i-1][j][k]>mat[i][j-1][k-1]:                        mat[i][j][k]=mat[i-1][j][k]                        mk[i][j][k]='100'                    else:                        mat[i][j][k]=mat[i][j-1][k-1]                        mk[i][j][k]='011'                else:                    lst=[mat[i][j][k-1],mat[i][j-1][k],mat[i][j-1][k-1],                         mat[i-1][j][k],mat[i-1][j][k-1],mat[i-1][j-1][k]]                    p=lst.index(max(lst))                    mat[i][j][k]=max(lst)                    mk[i][j][k]=dp[p]    print "LEN=%d" % mat[m][n][w]    sys.stdout.write("LCS=")    printf(mk,x,m,n,w)    sys.stdout.write('\n')


0 0
原创粉丝点击