我正在使用这个程序来计算后缀数组和最长公共前缀。
我需要计算两个字符串之间的最长公共子字符串。
为此,我连接字符串,A#B
然后使用这个算法。
我有后缀数组sa[]
和LCP[]
数组。
LCP[]
最长的公共子串是数组的最大值。
为了找到子串,唯一的条件是在相同长度的子串中,字符串B中第一次出现的那个应该是答案。
为此,我维持 LCP[] 的最大值。如果LCP[curr_index] == max
,那么我确保left_index
子字符串 B 的 小于 的先前值left_index
。
但是,这种方法并没有给出正确的答案。错在哪里?
max=-1;
for(int i=1;i<strlen(S)-1;++i)
{
//checking that sa[i+1] occurs after s[i] or not
if(lcp[i] >= max && sa[i] < l1 && sa[i+1] >= l1+1 )
{
if( max == lcp[i] && sa[i+1] < left_index ) left_index=sa[i+1];
else if (lcp[i] > ma )
{
left_index=sa[i+1];
max=lcp[i];
}
}
//checking that sa[i+1] occurs after s[i] or not
else if (lcp[i] >= max && sa[i] >= l1+1 && sa[i+1] < l1 )
{
if( max == lcp[i] && sa[i] < left_index) left_index=sa[i];
else if (lcp[i]>ma)
{
left_index=sa[i];
max=lcp[i];
}
}
}