KMP算法C++代码

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

 

    原文作者:KMP算法
    原文地址: https://blog.csdn.net/majcos/article/details/1326414
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞