#include"iostream"
using namespace std;
// 暴力匹配算法
bool string_match(char *mains,unsigned int mainslength,char *childs,int childslength)
{
int j;
for(int i=0;i<mainslength;i++)
{
for(j=0;j<childslength;j++)
{
// 如果不相等
if(mains[i+j]!=childs[j])
{
break;
}
}
if(j==(childslength-1))
{
// 成功匹配
return true;
}
}
// 匹配失败
return false;
}
// 字符串匹配算法:kmp
// 生成前缀表
unsigned int *gen_prefix(char *p,unsigned int length)
{
// 得到p的长度
unsigned int m =length;
// 创建一个大小为m的数组
unsigned int *w =new unsigned int[m];
// 第一个默认为0
w[0]=0;
//
unsigned int k=0;
// 从第2个到最后一个
for(int q=1;q<m;q++)
{
//如果满足这个条件
while(k>0 && p[k]!=p[q])
{
// 就把前一个的给k
k=w[k-1];
}
// 如果这个字符相等
if(p[k]==p[q])
{
// k++
k++;
}
// 得到新的前缀数
w[q]=k;
}
// 返回前缀数组
return w;
}
// kmp字符串匹配算法
bool kmp_match(char *T,unsigned int length_T,char *P,unsigned int length_P)
{
// 两个数组的边界
unsigned int n=length_T;
unsigned int m=length_P;
// 得到前缀数组
unsigned int *w = gen_prefix(P,length_P);
unsigned int q =0;
// 匹配到最后一个字符
for(int i=0;i<n;i++)
{
// 如果满足一下条件
while(q>0 && P[q]!=T[i])
{
// q就是前一个字符
q=w[q-1];
}
// 如果两个字符相等
if(P[q]==T[i])
{
q++;
}
// 如果q和m相等,匹配成功
if(q==m)
{
return true;
}
}
// 匹配失败
return false;
}
int main(int argc,char *argv[])
{
// 字符串主串
char mains[]="abaacababcac";
// 字符串子串
char childs[]="cabab";
cout<<kmp_match(mains,sizeof(mains)-1,childs,sizeof(childs)-1);
return 0;
}
C++实现KMP(Knuth-Morris-Pratt)字符串匹配算法
最新推荐文章于 2022-12-02 15:56:44 发布