最长公共子序列的范围查询

问题描述

最长公共子序列的一般问题(以后用作LCS :-

给定两个字符串,找出它们中存在的 LCS 的长度。子序列是以相同的相对顺序出现的序列,但不一定是连续的。

例如:- “abc”,“abg”,“bdf”,“aeg”,‘”acefg”, .. 等是 “abcdefg” 的子序列。但 “acb”,“age”... 等不是。

我们可以使用动态规划O(nm)中找到解决方案,其中n和m分别是字符串的长度。这是相同的伪代码:-

Procedure Lcslength(s1,s2):
Table[0][0] = 0
for i from 1 to s1.length
    Table[0][i] = 0
endfor
for i from 1 to s2.length
    Table[i][0] = 0
endfor
for i from 1 to s2.length
    for j from 1 to s1.length
        if s2[i] equals to s1[j]
            Table[i][j] = Table[i-1][j-1] + 1
        else
            Table[i][j] = max(Table[i-1][j],Table[i][j-1])
        endif
    endfor
endfor
Return Table[s2.length][s1.length]

但是,现在我有 [L,R] 形式的几个查询,并且在每个查询中,我必须找到 string1 的 LCS 的长度和string2 即.(s2[L] s2[L+1].....s2[R]).

例如:-

s1= "aacdef"

s2= "aaxcef"

query [0,3]: - s1= "aacdef"

               s2= "aaxc"

               length of LCS of s1 and s2 = 3 (LCS = "aac")

query [2,5]: - s1= "aacdef"

               s2= "xcef"

               length of LCS of s1 and s2 = 3 (LCS = "cef")

一种蛮力方法是在每次询问新查询时简单地运行通用 LCS 解决方案。但是如果查询数量很大,它的时间复杂度会变得非常大。那么,我们可以做得比这更好吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)