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
;
}