用后缀树查找两个单词中最长的子串

Posted

技术标签:

【中文标题】用后缀树查找两个单词中最长的子串【英文标题】:Find longest substring in two words with suffix tree 【发布时间】:2021-12-15 01:28:33 【问题描述】:

我需要解决问题 - 用后缀树查找两个单词中最长的子字符串。我为第一个和第二个单词建立了后缀,但是如何在两个单词中找到最长的子字符串? 你能推荐一个可能的算法来解决这个问题吗?

【问题讨论】:

你的意思是最长公共子串? 【参考方案1】:

诀窍是为两个单词使用一个后缀树:

    首先使用一些非字符串字符,如$# 或其他东西(不能是任何字符串的一部分)来连接字符串

    即字符串abraabracadabra 加入abra$abracadabra#

    然后从中构建后缀树。

    现在从以 $ 结尾的叶子开始向上爬并将节点标记为 word1 的一部分

    对以# 结尾的叶子执行相同操作,将它们标记为 word2 的一部分

    现在我们可以从根进行简单的DFS 遍历,因为最长的子字符串将是根的某个路径(仅检查同时属于两个单词的节点)

复杂性 - O(a+b)(后缀树构建(如果构建快速方式)+ O(a+b) (dfs) = O(a+b)

【讨论】:

通用的后缀树是要走的路,但 DFS 和使用哨兵跳过路径还不够。您绝对不想搜索过去的 $,因为它不是共享字符串,但还有其他字符串也不是共享的。如果字符串是 a$bbbb,那么没有 $ 的最长字符串是 bbbb,它只出现一次。你只想要内部节点。但是在那里,最长的是 bbb。您想要两个字符串都带有叶子的内部节点。一个 DFS 首先识别哪些节点在两个字符串中都有子节点,然后一个 DFS 识别重复将这样做,并且仍然在 O(a+b)

以上是关于用后缀树查找两个单词中最长的子串的主要内容,如果未能解决你的问题,请参考以下文章

Cool Slogans(后缀自动机+线段树+dp)

没有动态编程或后缀树的最长公共子串

最长回文子串和后缀特里树

bzoj 2865 字符串识别 —— 后缀数组

如何使用树找到最长的公共子串?

ural1297(后缀树组+rmq)