首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从同一位置找到所有可能的最长公共子序列

如何从同一位置找到所有可能的最长公共子序列
EN

Stack Overflow用户
提问于 2013-05-22 10:35:12
回答 2查看 1.5K关注 0票数 2

我试图从多个固定长度字符串的相同位置(总共有700个字符串,每个字符串有25个字母)找到所有可能最长的公共子序列。最长的公共子序列必须至少包含3个字母,并且至少属于3个字符串。所以如果我有:

代码语言:javascript
复制
String test1 = "abcdeug";
String test2 = "abxdopq";
String test3 = "abydnpq";
String test4 = "hzsdwpq";

我需要的答案是:

代码语言:javascript
复制
String[] Answer = ["abd", "dpq"];

我的一个问题是,这需要尽可能快。我试图用后缀树来寻找答案,但是后缀树方法的解决方案是["ab","pq"].Suffix树只能从多个strings.The公共最长公共子序列中找到连续的子串,不能解决这个问题。有没有人知道如何在低时间成本下解决这个问题?谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-22 19:14:19

我建议你在尝试使用任何听起来像你想做的事情的算法之前,先把这个问题转化成一个众所周知的计算问题。

这是我的建议:把这个问题转化成一个图问题。为字符串中的每个位置创建一组节点(集合中所有字符串中该位置的每个唯一字母对应一个节点...因此,如果所有700个字符串在相同位置不同,则为700个节点)。一旦您为字符串中的每个位置创建了所有节点,您将遍历您的字符串集合,查看两个位置共享3个以上相等连接的频率。在您的示例中,我们首先查看位置1和2,并看到三个字符串在位置1中包含"a“,在位置2中包含"b”,因此我们在图的第一组节点中的节点"a“和第二组节点中的"b”之间添加了一个有向边(对于所有位置对和这两个位置中的所有字母组合继续执行此操作)。您可以对每个职位组合执行此操作,直到添加了所有必要的链接。

一旦您有了最终的图,就必须寻找最长的路径;我建议您查看维基百科上的文章:Longest Path。在我们的例子中,我们将有一个有向无环图,你可以在线性时间内解决它!预处理应该是字符串位置的二次方,因为我假设你的字母表是固定大小的。

附言:你给我发了一封关于我正在研究的双簇算法的电子邮件;它还没有发表,但将在今年的某个时候发布(祈祷吧)。不过,还是要感谢您的关注:)

票数 1
EN

Stack Overflow用户

发布于 2013-05-22 11:52:26

您可以尝试使用散列。

每个字符串最多包含25个字符。这意味着它有2^25个子序列。取每个字符串,计算所有2^25个哈希值。然后连接所有字符串的所有散列,并计算其中哪些至少包含3次。为了获得这些子序列的长度,您不仅需要存储散列,还需要存储subsequence_pointer确定散列的子序列的<hash, subsequence_pointer>对(最简单的方法是枚举所有字符串的所有散列并存储散列号)。

根据算法,在最坏的情况下(700个字符串,每个字符串25个字符),程序将运行几分钟。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16682574

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档