我遇到了一个有趣的字符串问题,但无法解决它。 假设我们给每个3个字符的N个字符串,我们需要构造一个长度为N + 2的字符串,使得它包含所有上述N个字符串作为子字符串。如果解决方案不存在 - 打印" -1" 任何人都可以帮助我解决这个问题吗?
答案 0 :(得分:4)
我的答案在本质上与Pham Trung's one类似,但我选择构建另一个可以有效解决问题的图表。
首先,请注意每个给定的部分必须在我们的结果中出现一次。
它们可以显示N
件和N
个位置。
当所有给定的部分不同时,这必须是双射(一对一对应)。
当其中一些相同时,声明不清楚,但可以怀疑我们仍然必须将每个部分完全放置在输入中出现的次数。
现在,构建图表,其中每个可能的长度为 2 的字符串( <1> 比片段大小少)是一个顶点。
对于输入中的每个αβγ,构造一个从顶点αβ到顶点βγ的弧。
我们的任务现在相当于在此图中找到Eulerian path:N
弧的路径,它遍历每个给定的弧一次。
这是一个简单的多项式解决方案的常见问题:一个深度优先搜索会做,详见上述链接。
答案 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,我相信您应该让面试官澄清这一点。