如果我们有两个序列X =和Y =字母表。我们想要找到最短的序列,使得X和Y成为该序列的子序列。这项工作的时间复杂度是多少?
1)O(nm)
2)O(n + m)
3)O((n + m)log(n + m))
我的解决方案:我找到了一种动态编程方式并使用O(nm)顺序。任何想法更好的解决方案?
感谢任何人
答案 0 :(得分:3)
您可以将此问题减少到找到最长的公共子序列(LCS)。
给定两个序列及其最长的公共子序列,您可以使用类似合并的贪婪算法构建线性时间中的最短超级序列,该算法将X或Y中的字母添加到结果如果它们从公共子序列中丢失,则前进到下一个字母。显示该算法产生最短的超级序列是微不足道的,因为否则它将与我们使用最长公共子序列的断言相矛盾。
由于LCS解决方案都不是线性的,因此求解LCS也将主导算法以找到这个问题的答案。 LCS解决方案的复杂性取决于几个因素,例如字母表的长度。
A solution to the general LCS is O(n*m)
固定字母表上的LCS解决方案是O((n+m+c)*long(n+m)),其中c
是公共子序列的长度。