插入/删除列表之间的距离

时间:2013-09-23 19:32:44

标签: python algorithm list

给定两个名为A和B且长度相同的1和0的列表,我想确定是否有某种方法可以将n 1或0精确地插入A中,并且恰好将n 1或0插入B中以使它们相同名单。 n总是小于列表的长度。

例如,设置n = 2.设A = [0,0,1,1,0,0]B = [0,1,0,1,0,1]。我们可以通过插入1和0将A转换为[0,1,0,1,0,1,0,0]。通过在右端添加两个0,可以将B转换为相同的列表。

是否有一种已知的方法来计算这样的函数

def match(A,B,n):
    return True if A and B are exactly insertion distance n from a common list   

1 个答案:

答案 0 :(得分:2)

算法

您可以通过修改standard edit distance algorithm来找到最小插入次数(x)以使两个字符串相同来解决此问题。

当且仅当x <= 2 * n。

时,您的问题才可解决

Python代码:

A = [0,0,1,1,0,0]
B = [0,1,0,1,0,1]

def match(A,B,n):
    r = len(A)
    if r != len(B):
        return False
    DP = [ [0]*(r+1) for i in range(r+1) ]
    # DP[a][b] is min insertions to A to turn A[:a] and B[:b] into the same string
    for b in range(r+1):
        for a in range(r+1):
            if a>0 and b>0:
                best = DP[a-1][b-1]
                if A[a-1]!=B[b-1]:
                    best += 2 # inserting into both
            elif a==0 and b==0:
                best = 0
            else:
                best = 2*n+1

            if a>0:
                best = min(best,1+DP[a-1][b]) # inserting into A
            if b>0:
                best = min(best,1+DP[a][b-1]) # inserting into B
            DP[a][b] = best
    x = DP[r][r] # we have needed to make x insertions to get A and B to match
    # A and B are now the same length, so we must have made x/2 insertions to each
    return x<=2*n

print match(A,B,2)

说明

在您的情况下,您需要向A添加1和0,并向B添加两个0,因此x(插入的总数)将为4.

请注意,您可能会担心算法不会向两个字符串提供相同数量的插入。例如,它可能会找到一个解决方案,为A添加3个字符,从1添加到B.然而,这不是一个解决方案,因为这样的字符串会变成不同的长度。

如果结果是x小于2 * n,你可以简单地用相同的字符填充两个字符串,直到你设法为每个字符串添加n个字符。