void ComputeNext(const char *p,int next[])
{
const int n = strlen(p);
next[0] = -1;
for(int i = 1,j = -1;i < n;i++)
{
while(j > -1 && p[j+1] != p[i])
j = next[j];
if(p[i] == p[j+1])
j++;
next[i] = j;
}
}
int kmp(const char *s,const char *p)
{
const int n = strlen(s);
const int m = strlen(p);
if(n == 0 && m == 0)
return 0;
if(m == 0)
return 0;
int next[m];
ComputeNext(p,next);
for(int i = 0,j = -1;i < n;i++)
{
while(j > -1 && p[j+1] != s[i])
j = next[j];
if(s[i] == p[j+1])
j++;
if(j == m-1)
return i - j;
}
return -1;
}
int main()
{
char *s = "hello world";
char *p = "wor";
cout << kmp(s,p) << endl;
}
本文深入探讨了KMP算法的工作原理及其实现过程。通过详细的步骤解释如何使用KMP算法进行字符串匹配,并提供了完整的C++代码示例,帮助读者理解算法背后的逻辑。
9万+

被折叠的 条评论
为什么被折叠?



