用后缀树查找两个单词中最长的子串
Posted
技术标签:
【中文标题】用后缀树查找两个单词中最长的子串【英文标题】:Find longest substring in two words with suffix tree 【发布时间】:2021-12-15 01:28:33 【问题描述】:我需要解决问题 - 用后缀树查找两个单词中最长的子字符串。我为第一个和第二个单词建立了后缀,但是如何在两个单词中找到最长的子字符串? 你能推荐一个可能的算法来解决这个问题吗?
【问题讨论】:
你的意思是最长公共子串? 【参考方案1】:诀窍是为两个单词使用一个后缀树:
首先使用一些非字符串字符,如$
或#
或其他东西(不能是任何字符串的一部分)来连接字符串
即字符串abra
和abracadabra
加入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)以上是关于用后缀树查找两个单词中最长的子串的主要内容,如果未能解决你的问题,请参考以下文章