algorithm – 使用LRS数组增强的因子oracle查找多个字符串的最长公共子字符串

我们可以使用带后缀链接的因子oracle( paper here)来计算多个字符串的最长公共子字符串吗?这里,substring表示原始字符串的任何部分.例如,“abc”是“ffabcgg”的子串,而“abg”则不是.

我找到了一种方法来计算两个字符串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快速重新发现输入字符串之间的断点,作为其搜索公共因子的一部分(唯一的连接符提供并立即提示以停止扩展到目前为止发现的最佳因子) .

相关文章

Java Oracle 结果集是Java语言中处理数据库查询结果的一种方...
Java AES和Oracle AES是现代加密技术中最常使用的两种AES加密...
Java是一种广泛应用的编程语言,具备可靠性、安全性、跨平台...
随着移动互联网的发展,抽奖活动成为了营销活动中不可或缺的...
Java和Oracle都是在计算机领域应用非常广泛的技术,他们经常...
Java 是一门非常流行的编程语言,它可以运行于各种操作系统上...