有三种方法
1、直接匹配 2、首尾匹配 3、KMP算法
(1) 前两种算法时间复杂度为O(M*N);后一种为O(m+n)
(2)算法1实际执行时间近似O(m+n),KMP算法只有模式串与主串之间有很多部分匹配的情况下才显得高效。
但是KMP算法的优点在于主串指针不回溯,对处理从外设输入的庞大数据文件很有效,可以边读入边匹配,无需回头重读。
1、直接匹配法
int index(SString S, SString T, int pos)
{
i=pos; j=1;
while(i<=S[0]||j<=T[0])
{
if(S[i]==T[j]) {i++; j++;}
else
{i=i-j+2; j=1;}
}
if(j>T[0]) return i-j+1;
else
return 0;
}
//注:此处T[0]意为字符串T的长度,实际数据从T[1]开始
2、首尾匹配
int index(SString S, SString T, int pos)
{
sLength=S[0]; tLength=T[0];
i=pos;
while(i<=sLength-tLength+1)
{
if(S[i]!=S[1]) ++i;
else if(S[i+tLength-1]!=T[tLength]) ++i;
else
{
k=1;j=2;
while(j<tLength&&S[k+i]==T[j])
{++k;++j}
if(j==tLength) return i;
else ++i;
}
}
return 0;
}
//注:此处T[0]意为字符串T的长度,实际数据从T[1]开始
3、KMP算法
int index(SString S, SString T, int pos)
{
i=pos; j=1;
while(i<=S[0]||j<=T[0])
{
if(S[i]==T[j]) {i++; j++;}
else
j = next[j];
}
if(j>T[0]) return i-j+1;
else
return 0;
}
void get_next(SString T, int next[])
{
i=1; next[1]=0; j=0;
while(i<T[0])
{
if(j==0||T[i]==T[j])
{
++i; ++j;
if(T[i]==T[j]) next[i]=next[j];
else next[i] = j;
}
else
j=next[j];
}
}
//注:此处T[0]意为字符串T的长度,实际数据从T[1]开始