【发布时间】:2014-03-12 17:55:19
【问题描述】:
我使用this program 来计算后缀数组和最长公共前缀。
我需要计算两个字符串之间的最长公共子字符串。
为此,我连接字符串A#B,然后使用this algorithm。
我有后缀数组sa[] 和LCP[] 数组。
最长公共子串是LCP[]数组的最大值。
为了找到子串,唯一的条件是在相同长度的子串中,字符串B中第一次出现的那个应该是答案。
为此,我保持 LCP[] 的最大值。如果LCP[curr_index] == max,那么我确保子串B的left_index小于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];
}
}
}
【问题讨论】:
标签: c++ arrays suffix-array longest-substring longest-prefix