来自一袋琴弦的超级序列

时间:2011-12-14 10:08:48

标签: string algorithm graph

给定一个字符串s,从一包字符串中识别s的最短超序列的最有效方法是什么?此外,s的最后一个字符应与超弦的最后一个字符匹配。

3 个答案:

答案 0 :(得分:2)

除非我误解了,否则这个问题肯定在P。

一种天真的方法是:

  1. 将B中的所有字符串以与s相同的字符结尾。把这个新包叫做B'。可以在O(| B |)
  2. 中完成
  3. 选择包B'中s的超序的所有字符串。    对于B中的z,可以在O(| B'| * max(| z |))中完成。测试给定的字符串s是否是另一个字符串的子序列z可以在O(| z |)
  4. 选择以前找到的最短字符串(在O(| B'|))
  5. 其中| x |表示x的大小。

    您可以组合这些步骤,但无论如何它都是O(| B | * max(| z |))。

答案 1 :(得分:1)

假设行李不经常变化,我会构建一个DAWG并用A *搜索。

答案 2 :(得分:0)

运行包中的每个字符串,使用像KMP这样的快速字符串搜索来检查s是否是子字符串。检查哪个超弦最短。这是O(Σlength of strings in bag)

如果您需要多次搜索,可以为包中的每个字符串构建一个后缀trie,然后合并它们。然后,您可以在O(|s|)中进行查找。