构造回原始字符串

时间:2015-01-27 17:15:15

标签: string algorithm

我遇到了一个有趣的字符串问题,但无法解决它。 假设我们给每个3个字符的N个字符串,我们需要构造一个长度为N + 2的字符串,使得它包含所有上述N个字符串作为子字符串。如果解决方案不存在 - 打印" -1" 任何人都可以帮助我解决这个问题吗?

2 个答案:

答案 0 :(得分:4)

我的答案在本质上与Pham Trung's one类似,但我选择构建另一个可以有效解决问题的图表。

  1. 首先,请注意每个给定的部分必须在我们的结果中出现一次。 它们可以显示N件和N个位置。 当所有给定的部分不同时,这必须是双射(一对一对应)。 当其中一些相同时,声明不清楚,但可以怀疑我们仍然必须将每个部分完全放置在输入中出现的次数。

  2. 现在,构建图表,其中每个可能的长度为 2 的字符串( <1> 比片段大小少)是一个顶点。 对于输入中的每个αβγ,构造一个从顶点αβ到顶点βγ的弧。 我们的任务现在相当于在此图中找到Eulerian pathN弧的路径,它遍历每个给定的弧一次。 这是一个简单的多项式解决方案的常见问题:一个深度优先搜索会做,详见上述链接。

答案 1 :(得分:3)

首先,我们可以看到最终结果的长度为N + 2,每个字符串的长度为3,这意味着,在最终结果中,每个字符串只会出现一次,并且,从字符串开始ith到字符串(i +1)th,它们应该共享2个字符。

因此,我们可以创建一个有向图,其中N个节点代表N个字符串,如果节点(a,b)的最后两个字符,则在两个节点a之间存在边缘是节点b的前两个字符。

然后问题在于找到Hamiltonian path这是一个NP难问题。

因此,如果N(小于10)的数量很小,我们可以尝试N个字符串的每个排列,或者使用dynamic programming with bitmask,其中N <= 17。

如果图表是非循环图(DAG),您可以使用topological sorting to solve it,我相信您应该让面试官澄清这一点。