非常棘手的问题,但我会试一试。这更像是一种意识流而不是答案,提前道歉。
如果我理解正确,你会得到 2 个大小相等的字符串序列,A 和 B,从 1..n 开始索引,比如说。然后,您必须找到一个索引序列,使得字符串 A(1)..A(m) 的串联等于字符串 B(1)..B(m) 的串联,其中 m 是索引序列的长度.
我会观察到的第一件事是可能有无限数量的解决方案。例如,给定:
A { "x", "xx" }
B { "xx", "x" }
可能的解决方案是:
{ 1, 2 }
{ 2, 1 }
{ 1, 2, 1, 2 }
{ 1, 2, 2, 1 }
{ 2, 1, 1, 2 }
{ 2, 1, 2, 1 }
{ 1, 2 , 1, 2, 1, 2}
...
那么你怎么知道什么时候停止呢?只要你有一个解决方案?一旦一个解决方案是另一个解决方案的超集?
您可以开始的一个地方是从两组中获取所有最小公共长度的字符串(在我上面的示例中,您将从两者中获取“x”,并搜索 2 个共享公共索引的相等字符串。然后您可以对下一个大小的字符串重复此操作。例如,如果第一组有 3 个长度分别为 1、2 和 3 的字符串,而第二组分别有长度为 1、3 和 3 的字符串,则您将取长度 3. 你会这样做,直到你没有更多的字符串。如果你找到了,那么你就有了问题的解决方案。
然后,当您必须像上面的示例中那样开始组合多个字符串时,它会变得更加困难。天真的、蛮力的方法是开始排列两个集合中的所有字符串,当它们连接时,产生相同长度的字符串,然后比较它们。所以在下面的例子中:
A { "ga", "bag", "ac", "a" }
B { "ba", "g", "ag", "gac" }
您将从长度为 2 的序列开始:
A { "ga", "ac" }, B { "ba", "ag" } (索引 1, 3)
A { "bag", "a" }, B { "g", "gac" } (索引2、4)
比较这些给出了“gaac”与“baag”和“baga”与“ggac”,它们都不相等,所以那里没有解决方案。接下来,我们将寻找长度为 3 的序列:
A { "ga", "bag", "a" }, B { "ba", "g", "gac" } (索引 1, 2, 4)
A { "bag", "ac", "a" }, B { "g", "ag", "gac" } (索引 2, 3, 4)
同样,没有解决方案,所以我们最终得到大小为 4 的序列,其中我们没有解决方案。
现在它变得更加棘手,因为我们必须开始考虑也许重复一些索引,现在我的大脑正在融化。
我在想在字符串中寻找常见的子序列可能会有所帮助,然后使用字符串中不匹配的其余部分。但我不太清楚怎么做。