python 最长公共子序列

网上有很多,但有bug,特别是这个:http://www.oschina.net/code/snippet_16840_2015 好大的坑...

 

get length

def lcs_len(a,b):
    c = [[0 for j in b] for i in a]
    for i in range(len(a)):
        for j in range(len(b)):
            if i==0 or j==0:
                continue
            if a[i]==b[j]:
                c[i][j] = c[i-1][j-1]+1
            else:
                c[i][j] = max(c[i-1][j],c[i][j-1])
    return c[i][j]

 

get string

def lcs_string(a,b):
    lena,lenb = len(a),len(b)

    # length table
    c = [[0 for i in b] for j in a]

    # direction table
    flag = [[0 for i in b] for j in a]

    for i in range(lena):
        for j in range(lenb):
            if i==0 or j==0:           continue

            if a[i]==b[j]:
                c[i][j] = c[i-1][j-1]+1
                flag[i][j] = 3

            elif c[i-1][j]<c[i][j-1]:
                c[i][j] = c[i][j-1]
                flag[i][j] = 2
            else:
                c[i][j] = c[i-1][j]
                flag[i][j] = 1


    (p1,p2) = (lena-1,lenb-1)
    s = []
    while 1:
        d = flag[p1][p2]
        if d == 3:
            s.append(a[p1])
            p1 -= 1
            p2 -= 1 
        elif d == 2:
            p2 -= 1
        elif d == 1:
            p1 -= 1
        if p1==0 or p2==0:
            # solve the first element without print problem
            if a[p1]==b[p2]:
                s.append(a[p1])
            break
    s.reverse()
    return ''.join(s)

use into app

def lcs_from_list(input,jobnames):
    if input in jobnames:
        return input
    res = [(lcs_len(input,jobname),jobname) for jobname in jobnames]
    res.sort()
    return res[-1][1]

 

posted on 2015-12-24 17:00  星空守望者--jkmiao  阅读(929)  评论(0编辑  收藏  举报