KMP算法的思想一般数据结构书都有讲,没讲的话google一下,有很多文章解释了其思想。晚上写了写这个代码,虽然不难,但还是费了番功夫调试,出现的主要问题有:无符号整型数据与整型数据比较大小(让我越来越讨厌无符号数!),还有一个问题就是KMP算法本身与求next数组的算法很类似,但是有些微妙的区别,也让调试了几次。
int
*
GetNextVal(
const
char
*
s,
int
&
len)
{
len = strlen(s);
int * next = new int [len];
int i = 0 ;
int j = - 1 ;
next[ 0 ] = - 1 ;
while (i < len - 1 ) // 注意这里跟KMP函数里面的不同
{
if (j ==- 1 || s[i] == s[j])
{
++ i;
++ j;
next[i] = j;
}
else
{
j = next[j];
}
}
return next;
}
int KMP( const char * s, const char * t)
{
int slen,tlen;
int i,j;
int * next = GetNextVal(t, tlen);
slen = strlen(s);
i = 0 ;
j = 0 ;
while (i < slen && j < tlen)
{
if (j ==- 1 || s[i] == t[j])
{
++ i;
++ j;
}
else
{
j = next[j];
}
}
delete[] next;
if (j == tlen)
return i - tlen;
return - 1 ;
}
int main( int argc, char * argv[])
{
char s[ 128 ],t[ 128 ];
while (cin >> s >> t)
{
int pos1 = KMP(s,t);
int pos2 = strstr(s,t) - s;
cout << pos1 << " : " << pos2 << endl;
}
return 0 ;
}
{
len = strlen(s);
int * next = new int [len];
int i = 0 ;
int j = - 1 ;
next[ 0 ] = - 1 ;
while (i < len - 1 ) // 注意这里跟KMP函数里面的不同
{
if (j ==- 1 || s[i] == s[j])
{
++ i;
++ j;
next[i] = j;
}
else
{
j = next[j];
}
}
return next;
}
int KMP( const char * s, const char * t)
{
int slen,tlen;
int i,j;
int * next = GetNextVal(t, tlen);
slen = strlen(s);
i = 0 ;
j = 0 ;
while (i < slen && j < tlen)
{
if (j ==- 1 || s[i] == t[j])
{
++ i;
++ j;
}
else
{
j = next[j];
}
}
delete[] next;
if (j == tlen)
return i - tlen;
return - 1 ;
}
int main( int argc, char * argv[])
{
char s[ 128 ],t[ 128 ];
while (cin >> s >> t)
{
int pos1 = KMP(s,t);
int pos2 = strstr(s,t) - s;
cout << pos1 << " : " << pos2 << endl;
}
return 0 ;
}