最长公共子串

最长公共子串

def longSubStr(str1,str2):
    len1 = len(str1)
    len2 = len(str2)
    longest,start1,start2 = 0,0,0
    c = [[0 for i in range(len2+1)]for i in range(len1+1)]
    for i in range(len1+1):
        for j in range(len2+1):
            if i == 0 or j == 0:
                c[i][j] = 0
            elif str1[i-1] == str2[j-1]:
                c[i][j] = c[i-1][j-1]+1
            else:
                c[i][j] = 0
            if (longest < c[i][j]):
                longest = c[i][j]
                start1 = i-longest
                start2 = j-longest

    return str1[start1:start1+longest],start1,start2

最长公共子序列

def printLcs(flag,a,i,j):
    if i==0 or j==0:
        return
    if flag[i][j]=='OK':
        printLcs(flag,a,i-1,j-1)
        print a[i-1],
    elif flag[i][j]=='Left':
        printLcs(flag,a,i,j-1)
    else:
        printLcs(flag,a,i-1,j)

def longSubSeq(str1,str2):
    len1 = len(str1)
    len2 = len(str2)
    longest = 0
    c = [[0 for i in range(len2+1)]for i in range(len1+1)]
    flag = [[0 for i in range(len2+1)]for i in range(len1+1)]
    for i in range(len1+1):
        for j in range(len2+1):
            if i == 0 or j == 0:
                c[i][j] = 0
            elif str1[i-1] == str2[j-1]:
                c[i][j] = c[i-1][j-1]+1
                flag[i][j] = 'OK'
                longest = max(longest,c[i][j])
            elif c[i][j-1] > c[i-1][j]:
                c[i][j] =c[i][j-1]
                flag[i][j] = 'Left'
            else:
                c[i][j] =c[i-1][j]
                flag[i][j] = 'UP'
    printLcs(flag,str1,len1,len2)
    return longest
a='ABCBDAB'
b='BDCABA'
print longSubSeq(a,b)

 

posted @ 2021-08-15 14:59  holmes_now  阅读(46)  评论(0)    收藏  举报