您的位置:首页 > 其它

字符串模式匹配——KMP算法

2013-03-24 11:14 218 查看
字符串的模式匹配问题即为在一串字符A当中寻找到一个子串使得子串与另一个字符串完全相同,把子串起始的下标输出即可。

对于这个问题,可以很直白的进行解决,也就是通常说的朴素的模式匹配,但是相对来说时间复杂度较高,为L(A)*L(B)。作为改进,KMP算法的时间复杂度只是线性的,所以更优。

KMP算法的本身代码实现并不复杂,思想框架也不复杂,但是里面的利用失败函数寻找next值方法却不好理解。

它的具体的思想和算法过程,想要学习的可以网上搜一下,应有竟有,这里只粘出代码,但是敢肯定的是,只看代码是肯定理解不了的...

#include<stdio.h>

char target[1000]={'a','c','a','b','a','a','b','c','a','c','c','a','c','b','d'};
char pattern[100]={'a','b','c','a','c'};
int nextp[100];
int plength=5;
int tlength=15;

void getNext()
{
nextp[0]=-1;
int k=-1,j=1;
while(j<plength)
{
if(k==-1||pattern[k]==pattern[j])
{
k++;j++;
if(pattern[k]!=pattern[j])
{
nextp[j]=k;
}
else
{
nextp[j]=nextp[k];
}
}
else
{
k=nextp[k];
}
}
}

int match()
{
int i=0,j=0;
while(i<plength&&j<tlength)
{
while((pattern[i]==target[j])&&(i<plength&&j<tlength))
{
++i;++j;
}
if(i<plength&&j<tlength)
{
if(nextp[i]>-1)
{
i=nextp[i];
}
else
{
i=0;
j++;
}
}
else
{
break;
}
}

if(i==plength)
{
return j;
}
else
{
return -1;
}
}

int main()
{
getNext();
int i;
for(i=0;i<plength;i++)
{
printf("%d\t",nextp[i]);
}
printf("\n");
printf("%d\n",match()-plength);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: