String 一袋弦的超序列

String 一袋弦的超序列,string,algorithm,graph,String,Algorithm,Graph,给定一个字符串s,从一包字符串中识别s的最短超序列的最有效方法是什么?此外,s的最后一个字符应与超级字符串的最后一个字符匹配 假设包不经常更换,我会构造一个,并用*搜索它,除非我误解了它,这个问题肯定在p中 天真的做法是: 取B中以与s相同字符结尾的所有字符串。把这个新包叫做“B”。可以在O|B中完成| 选择包B'中s超序列的所有字符串。 它可以在O | B'|*max | z |中为B中的z进行测试。如果给定字符串s是另一个字符串z的子序列,则可以在O | z中进行测试| 选择之前在O | B

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

假设包不经常更换,我会构造一个,并用*

搜索它,除非我误解了它,这个问题肯定在p中

天真的做法是:

取B中以与s相同字符结尾的所有字符串。把这个新包叫做“B”。可以在O|B中完成| 选择包B'中s超序列的所有字符串。 它可以在O | B'|*max | z |中为B中的z进行测试。如果给定字符串s是另一个字符串z的子序列,则可以在O | z中进行测试| 选择之前在O | B'中找到的最短字符串之一| 其中| x |表示x的大小


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

遍历包中的每个字符串,使用类似KMP的快速字符串搜索检查s是否是子字符串。检查哪个超弦最短。这是包中字符串的O∑长度


如果需要多次搜索,可以为包中的每个字符串构造后缀trie,并合并这些字符串。然后可以在O | s |中查找。

如果包中没有以某个字符结尾的字符串的超序列,该怎么办?如果没有,则无法在多项式时间内枚举所有可能的字符串,因为它们的数量是指数级的。@templatetypedef则答案是“这样的超序列不存在”。OP正在寻找包中给定字符串的超序列af,这也是给定的。如果他找不到,就这样吧。。。我误解了这个问题!我以为OP是要找到,给定一包线,包中最短的超序列。那个问题是NP难问题。实际问题并不太难。我道歉!是的,那是NP难的。在看到两个答案提到它后,我开始怀疑自己:你的意思是,你有一个像{abbc,abbbbbb,ba}这样的袋子和一个像bb这样的字符串,并且想知道abbc是袋子里bb的最短超弦吗?如果将字符串存储在适当的数据结构中,则可以在O | s |中执行此操作。不完全是@ThomasAhle,在您的示例中,输出必须是'abbbb',因为bb和输出必须具有相同的最后一个字符。好的,因此s必须是后缀。有了{abb,abba,aabb,a}答案就是abb,对吗?这将使问题变得更容易。超序列和超字符串各出现一次,这个问题就不那么容易混淆了:使用类似集合和字符串ab的示例可能会有所帮助。