版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/JEYMING/article/details/80069302
/*
串的匹配算法
2018.04.24
*/
#include<iostream>
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
using namespace std;
#define MAXSIZE 100 //串的最大长度
#define OK 1
#define ERROR 0
#define OVERFLOW -1
typedef int Status;
//静态的,编译时确定了串的空间大小;
typedef struct{
//从下标1的数组分量中开始存储,下标0闲置不用
char ch[MAXSIZE+1]; //存储串的一维数组
int length; //串的当前长度
}SString;
//最简单模式匹配算法
//BF算法
//算法步骤:
//1.分别利用计数指针i和j指示主串S和模式T中当前正待比较的字符位置,i的初值为pos,j的初值为1;
//2.如果两个串均为比较到串尾,即i和j均分别小于等于S和T的长度时,则循环执行以下操作:
// *S.ch[i]和T.ch[j]比较,若相等,则i和j均分别指示串中下位置,继续比较后续字符;
// *若不相等,指针后退重新开始匹配,从主串的下一个字符(i=i-j+2)起再重新和模式的第一个字符(j=1)匹配;
//3.如果j>T.length,说明模式T中的每个字符一次和主串S中的一个连续的字符序列相等,在匹配成功,返回和模式T中第一个字符相等的字符在主串S中的序号;否则称匹配不成功,返回0;
int IndexBF(SString S,SString T,int pos){
int i=pos;
int 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-j+1; //匹配成功
else
return 0; //匹配失败
}
int main(){
SString S,T;
int sum=0;
cout<<"1.sum=";
cin>>sum;
for(int i=1;i<=sum;++i){
cout<<"S.ch["<<i<<"]:";
cin>>S.ch[i];
}
S.length=sum;
cout<<endl;
cout<<"2.sum=";
cin>>sum;
for(int i=1;i<=sum;++i){
cout<<"T.ch["<<i<<"]:";
cin>>T.ch[i];
}
T.length=sum;
int pos=0;
cout<<"pos:";
cin>>pos;
cout<<"the ch in "<<IndexBF(S,T,pos)<<endl;
return 0;
}