串的模式匹配算法的介绍:
子串的定位运算通常称为串的模式匹配或串匹配;最简单的模式匹配算法是BF算法。
算法描述:
int Index_BF(SString S,SString T,int pos)
{//返回模式T在主串S中的第pos个字符开始第一次出现的位置。若不存在,则返回值为0
//其中,T非空,1<=pos<=S.length
int i = pos,j = 1;//初始化
while(i <= S.length && j <= T.length)
{//两个串均未比较到串尾
if(S.ch[i] == T.ch[j])
{
i++;
j++;
}//继续比较后续字符
else{
i = i-j+2;
j = 1;
}//指针后退重新开始匹配
}
if(j > T.length)
return i-T.length;//匹配成功
else
return 0;//匹配失败
}
算法分析(在匹配成功的情况下):
最好情况:每趟不成功的匹配都发生在模式串的第一个字符与主串中相应字符的比较。
例如:
S = “aaaaaba”;
T = “ba”;
平均时间复杂度为O(n+m);
最坏情况:每趟不成功的匹配都生在模式串的最后一个字符与主串中相应字符的比较。
例如:
S = “aaaaaab”;
T = “aab”;
平均时间复杂度为O(n*m);
BF算法的具体实现代码:
#include<iostream>
using namespace std;
//串的定长顺序存储结构
#define MAXLEN 255
typedef struct
{
char ch[MAXLEN+1];
int length;
} SString;
//BF算法
int Index_BF(SString S,SString T,int pos)
{
int i = pos,j = 1;
while(i <= S.length && j <= T.length)
{
if(S.ch[i] == T.ch[j])
{
i++;
j++;
}else{
i = i-j+2;
j = 1;
}
}
if(j > T.length)
return i-T.length;
else
return 0;
}
//串的字符输入
void InputString(SString &S,SString &T)
{
int n,m;
cout<<"输入主串S的长度:";
cin>>n;
cout<<"依次输入主串S中的每个元素:";
for(int i = 1;i <= n;i++)
{
cin>>S.ch[i];
}
S.length = n;
cout<<"输入子串T的长度:";
cin>>m;
cout<<"依次输入子串T中的每个元素:";
for(int i = 1;i <= m;i++)
{
cin>>T.ch[i];
}
T.length = m;
}
//串的字符输出
void OutputString(SString S)
{
for(int i = 1;i <= S.length;i++)
{
cout<<S.ch[i]<<" ";
}
cout<<endl;
}
//主函数
int main()
{
SString S,T;
int k;
InputString(S,T);
k=Index_BF(S,T,1);
if(k == 0){
cout<<"子串在主串中没有相匹配的"<<endl;
} else{
cout<<"子串在主串中匹配的第一个字符相等的序号为:"<<k<<endl;
}
// OutputString(S);
// OutputString(T);
system("pause");
return 0;
}