运用BF和KMP两种方法进行字符串匹配(顺序串)
1.BF算法
2.KMP算法
例子:
s=“abceebcabcabc” t=“ebca”
返回值:4
输入:目标串//“abceebcabcabc”
模式串//“ebca”
输出:成功:模式串中第一个字符在目标串中的位置
不成功:-1
一、BF算法
int BF(sqstring s1,sqstring s2)
{
int i=0,j=0;
while(i<s1.length&&j<s2.length)
{//如果匹配则依次比较
if(s1.data[i]==s2.data[j])
i++,j++;
else
{//不匹配则回退
i=i-j+1;
j=0;
}
}
if(j>=s2.length)
return i-s2.length;
else
return -1;//不匹配则返回-1
}
二、KMP算法
//求模式串next数组函数
void kmpnext(sqstring s,int next[])
{//传数组时实际上是创建了临时的指针变量做形参,指向传入那个数组。
int j=0,k=-1;
next[0]=-1;
while(j<s.length-1)
{
if(k==-1||s.data[k]==s.data[j])
{
j++,k++;
next[j]=k;
}
else
{
k=next[k];
}
}
}
int KMP(sqstring s1,sqstring s2)
{
int i=0,j=0;
int next[maxsize];
kmpnext(s2,next);
while(i<s1.length&&j<s2.length)
{
if(j==-1||s1.data[i]==s2.data[j])
{
i++,j++;
}
else
j=next[j];
}
if(j>=s2.length)
return i-s2.length;
else
return -1;
}
以KMP算法为例运行模式匹配算法
#include<iostream>
using namespace std;
const int maxsize=50;
//声明串的类型
typedef struct
{
char data[maxsize];
int length;
} sqstring;
//初始化顺序串
void initstring(sqstring &s,char a[])
{
int i;
for(i=0;a[i]!='\0';i++)
{
s.data[i]=a[i];
}
s.length=i;
}
//求模式串next数组函数
void kmpnext(sqstring s,int next[])
{//传数组时实际上是创建了临时的指针变量做形参,指向传入那个数组。
int j=0,k=-1;
next[0]=-1;
while(j<s.length-1)
{
if(k==-1||s.data[k]==s.data[j])
{
j++,k++;
next[j]=k;
}
else
{
k=next[k];
}
}
}
int kmp(sqstring s1,sqstring s2)
{
int i=0,j=0;
int next[maxsize];
kmpnext(s2,next);
while(i<s1.length&&j<s2.length)
{
if(j==-1||s1.data[i]==s2.data[j])
{
i++,j++;
}
else
j=next[j];
}
if(j>=s2.length)
return (i-s2.length);
else
return (-1);
}
int main()
{
sqstring s1,s2;
char a1[maxsize],a2[maxsize];
cout<<"输入目标串: "<<endl;
cin>>a1;
cout<<"输入模式串: "<<endl;
cin>>a2;
initstring(s1,a1);
initstring(s2,a2);
cout<<KMP(s1,s2)<<endl;
return 0;
}
输入目标串:
abceebcabcabc
输入模式串:
ebca
4
--------------------------------
Process exited after 28.34 seconds with return value 0
请按任意键继续. . .