合并字符数组中的最小重复

时间:2019-04-20 03:43:39

标签: string algorithm dynamic-programming computer-science

假设我有两个数组,我想将它们合并,以使合并后的数组具有最小重复次数。例如[ 'x', 'x' ]是重复。

arr1 = [ 'x', 'd', 'd', 'm', 'f', 'm' ]
arr2 = [ 'd', 'd', 'x', 'f', 'f', 'm' ]

唯一的条件是,在合并数组中,arr1arr2中的元素必须以各自的顺序出现在arr1arr2中。 / strong>以下是在保持此条件的情况下具有0次重复的合并数组的示例。

merged = [ 'd', 'x', 'd', 'x', 'd', 'f', 'd', 'm', 'f', 'm', 'f', 'm' ]

我正试图将此问题与流行的动态编程问题联系起来,以帮助我。有没有类似的问题我应该研究?

1 个答案:

答案 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