找到多项式时间算法或证明以下问题的 np 难度:
给定两个字符串s1=a1, a2,...,ak,s2=b1,...,bk,其中s2是 的随机排列s1。
我们现在想要s1构建s2. 建设工程如下:
从 中选择一个字母s2,等于a1并将其删除。
继续,用字母a2并将其删除等等,直到s2为空。
请注意,同一个字母可以在 中出现多次s2。让C = c1, c2,...,ck为构造的序列,因此C = s1。我们定义为需要跳回以选择下一个字母l的次数。s2
例如,如果我们选择c3和,但原始 中的c4索引小于原始 中的索引,我们就会加一。c4s2c3s2l
我们的任务是找到最佳序列,使之l最小。例如,如果给定s1=abac,s2=acab输出必须为 1,因为我们可以从 中选取第二个“a” s2,然后选择“b”,然后跳回并选取第一个“a”,然后添加“c”。
我不知道如何在多项式时间内解决这个问题。我想也许有某种方法可以计算完美匹配并读取最佳序列,但我不确定。到目前为止,我只有指数算法。
指数算法如下(不确定是否正确,不知道如何测试):
def solvenaive(s1, s2, curr_ind):
if len(s1) == 0: …Run Code Online (Sandbox Code Playgroud)