#include<iostream>
#include<string.h>
#include<utility>
#include<algorithm>
using namespace std;
struct xx
{
string x;
short int d;
int lcp;
};
bool compare(const xx a,const xx b)
{
return a.x<b.x;
}
int findlcp(string a,string b)
{
int i=0,j=0,k=0;
while(i<a.length() && j<b.length())
{
if(a[i]==b[j])
{
k++;
i++;
j++;
}
else
{
break;
}
}
return k;
}
int main()
{
string a="banana";
xx b[100];
a=a+'$';
int len=a.length();
for(int i=0;i<len;i++)
{
b[i].x=a.substr(i);
b[i].d=i+1;
}
sort(b,b+len,compare);
for(int i=0;i<len;i++)
cout<<b[i].x<<" "<<b[i].d<<endl;
b[0].lcp=0;
b[1].lcp=0;
for(int i=2;i<len;i++)
{
b[i].lcp=findlcp(b[i].x,b[i-1].x);
}
for(int i=0;i<len;i++)
cout<<b[i].d<<" "<<b[i].lcp<<endl;
}
这是 Suffix Array的一个实现。在最坏的情况下,我在维基百科文章结构中的问题是 o(n)
所以在我的建设中:
- 我正在使用 stl sort 对字符串的所有后缀进行排序。在最坏的情况下,这可能至少是 O(nlogn)。所以我在这里违反了 O(n) 构造。
- 第二个是在构造一个最长的公共前缀数组构造时给出 O(n)。但我认为我在 O(n^2) 中的实现
所以对于第一个,即排序
如果我使用计数排序,我可能会减少到 O(n)。如果我使用计数排序,它是否正确?我的理解是否正确?让我知道我的理解是否错误
有没有办法在 O(n) 时间内找到 LCP?