给定两个名为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
答案 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个字符。