我找到了一种方法来计算两个字符串s1和s2的最大长度公共子串.它通过使用不在其中的字符连接两个字符串来工作,例如’$’.然后,对于长度为i> = | s1 |的连接字符串s的每个前缀在图2中,我们计算其lrs(最长重复后缀)长度lrs [i]和sp [i](其lrs的第一次出现的结束位置).最后,答案是
max{lrs[i]| i >= |s1| + 2 and sp[i] <= |s1|}
我编写了一个使用这种方法的C程序,当| s1 |时,我的笔记本电脑可以在200ms内解决问题| S2 | < = 200000,使用因子oracle.
s1 = 'ffabcgg' s2 = 'gfbcge' s = s1+'$'+s2 = 'ffabcgg$gfbcge' p: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 s: f f a b c g g $g f b c g e sp: 0 1 0 0 0 0 6 0 6 1 4 5 6 0 lrs:0 1 0 0 0 0 1 0 1 1 1 2 3 0 ans = lrs[13] = 3
我知道这两个问题都可以使用后缀数组和后缀树来高效解决,但我想知道是否有一个方法使用因子oracle来解决它.我对此感兴趣,因为oracle因素易于构造(30行C,后缀数组需要大约60,后缀树需要150),并且运行速度比后缀数组和后缀树快.
您可以在this OnlineJudge中测试第一个问题的方法,在here中测试第二个问题.
Can we use a factor-oracle with suffix link (paper here) to compute
the longest common substring of multiple strings?
我不认为算法非常适合(它被设计为考虑单个字符串)但您可以通过将原始字符串与唯一分隔符连接来使用它.
给定abcdefg和hijcdekl和mncdop,找到最长的公共子串cd:
# combine with unique joiners >>> s = "abcdefg" + "1" + "hijcdekl" + "2" + "mncdop" >>> factor_oracle(s) "cd"
作为其线性时间和空间算法的一部分,因子oracle快速重新发现输入字符串之间的断点,作为其搜索公共因子的一部分(唯一的连接符提供并立即提示以停止扩展到目前为止发现的最佳因子) .
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。