问题描述
最长公共子序列的一般问题(以后用作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 (将#修改为@)