64,649
社区成员
发帖
与我相关
我的任务
分享
void get_nextval(char const* ptrn, int plen, int* nextval)
{
int i = 0;
nextval[0] = -1;
int j = -1;
//初始化
while( i < plen-1 )
{
if( j == -1 || ptrn[i] == ptrn[j] )
{
++i;
++j;
if( ptrn[i] != ptrn[j] )
nextval[i] = j;
else
nextval[i] = nextval[j];
}
else
j = nextval[j];
}
}
void getNext(char *p,int *next)
{
int j,k;
next[0]=-1; j=0; k=-1;
while(j<strlen(p)-1)
{
if(k==-1||p[j]==p[k])
{
j++;
k++;
next[j]=k;
}
else
k=next[k];
}
}
template<typename ElemType>
int MatchKMP(ElemType* t, int n, ElemType* p, int m, vector<int>& result)
{
int * Prefix = new int[m];
{
// Prefix[i]表示串p[0], p[1], ... p[Prefix[i]]和 p[i-Prefix[i]], p[i-2], p[i-1], p[i]
// 相同,且Prefix[i]最大
// 也就是最长的前缀,使得和后缀相同
Prefix[0] = -1; // 初始值为-1,
for (int i = 1, F = -1; i < m; ++i)
{// 计算Prefix[i]
// F表示Prefix[i-1]的值
// 要计算Prefix[i]则可以根据F算出来,如果F位置后面的那个
// 和p[i]相同,那么F+1就是所求,否则让F向前推一层
while (F >= 0 && p[F+1] != p[i]) F = Prefix[F];
if (p[F+1] == p[i]) ++F;
Prefix[i] = F;
}
}
{
result.clear();
for (int i = 0, F = -1; i < n; ++i)
{
while (F >= 0 && p[F+1] != t[i]) F = Prefix[F];
if (p[F+1] == t[i]) ++F;
if (F+1 == m)
{
result.push_back(i-m+1);
F = Prefix[F];
}
}
}
delete[] Prefix;
return result.size();
}