假设我有两个数组,我想将它们合并,以使合并后的数组具有最小重复次数。例如[ 'x', 'x' ]
是重复。
arr1 = [ 'x', 'd', 'd', 'm', 'f', 'm' ]
arr2 = [ 'd', 'd', 'x', 'f', 'f', 'm' ]
唯一的条件是,在合并数组中,arr1
和arr2
中的元素必须以各自的顺序出现在arr1
和arr2
中。 / strong>以下是在保持此条件的情况下具有0次重复的合并数组的示例。
merged = [ 'd', 'x', 'd', 'x', 'd', 'f', 'd', 'm', 'f', 'm', 'f', 'm' ]
我正试图将此问题与流行的动态编程问题联系起来,以帮助我。有没有类似的问题我应该研究?
答案 0 :(得分:2)
我定义以下函数: F(d,i,j)=长度为i的arr1
前缀和{{1}前缀的字符串构成的最小重复次数},长度为j,后跟arr2
中的第ith(d = 0)或第j(d = 1)个符号。因此,F(d,i,j)对应于长度为i + j + 1的字符串。
如果您熟悉Levenshtein距离的计算方式,可以认为它不是将分数分配给网格的顶点,而是将分数分配给边缘,其中arr[d]
表示水平或垂直边缘。这为我们提供了一个符号的“内存”,因此我们可以检测到重复。
以下C ++代码计算最小重复次数,并以二次时间打印相应的字符串:
d