C++ 修改的最长公共子串
我正在使用后缀数组读取两个字符串之间最长的公共子字符串。我编写了一个程序来开发一个O(N)复杂度的字符串后缀数组 现在我想修改程序,找到两个字符串的所有最长公共子字符串。如何操作 例如:C++ 修改的最长公共子串,c++,algorithm,C++,Algorithm,我正在使用后缀数组读取两个字符串之间最长的公共子字符串。我编写了一个程序来开发一个O(N)复杂度的字符串后缀数组 现在我想修改程序,找到两个字符串的所有最长公共子字符串。如何操作 例如: 让S1=xyzabc S2=abcxyz,这里的答案是最长公共子字符串的长度是3和{“abc”,“xyz”} 请帮忙 (假设我在数组SA[]中找到了后缀数组) void kasaiLCP(){ 对于(inti=0;i
让S1=xyzabc S2=abcxyz,这里的答案是最长公共子字符串的长度是3和{“abc”,“xyz”}
请帮忙
(假设我在数组SA[]中找到了后缀数组)
void kasaiLCP(){
对于(inti=0;i0){
int j=SA[c[i]-1];
而(i+h0)-h;
}
}
此LCP实施是否正确?我的后缀数组是0索引的
对于S1=abcabc和S2=bc。
我的后缀数组SA[]=[6,3,0,7,4,1,8,5,2]
LCP数组be=[0,0,3,0,2,2,0,1,1]
对吗 创建
S1$S2
的通用后缀数组。使用RMQ设置高度数组,以查找O(1)中后缀的LCP。用它来自的字符串的编号标记每个后缀。通过SA,使用另一个字符串中最近看到的后缀计算每个后缀的LCA。您将拥有所有公共子字符串。找到其中最长的。如果你能实现一个在线性时间内构造后缀数组的算法,这应该是小菜一碟:)@NiklasB。请解释“使用RMQ设置一个高度数组,以查找O(1)中后缀的LCP”。请详细说明您想说什么。我不明白。@NiklasB。我经历过这一切,但这对我毫无帮助。你不需要这样做。您只需要SA中相邻后缀的LCP
void kasaiLCP () {
for (int i = 0; i < str.length(); ++i) c [SA [i]] = i;
LCP [0] = 0;
for (int i = 0, h = 0; i < str.length(); ++i) if (c[i] > 0) {
int j = SA [c [i] - 1];
while (i + h < str.length() && j + h < str.length() && str [i + h] == str [j + h]) ++h;
LCP [c [i]] = h;
if (h > 0) --h;
}
}