oracle查询最长字符串,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中测试第二个问题.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值