问题引入
利用模式匹配算法,对采用定长顺序存储结构的字符主串,从它的第pos个字符起和模式的字符比较,若相等,则继续逐个比较后续字符,直到模式串中的每个字符都和主串中的字符序列匹配成功,返回主串的pos。
例如:
模式串是”0000 1”,主串是”0000 0000 0000 0000 0000 1”。
代码实现
#include<iostream>
#include<stdio.h>
using namespace std;
#define Volume 100 //定义串初始容量为100
//定义串结构
typedef struct{
char ch[Volume]; //串的容量
int length; //串长
}HString;
//存入串值
void createHString(HString &S,int n){
S.length=n; //存储串长
for(int i=0;i<n;i++){ //输入串值
cin>>S.ch[i];
}
}
//输出串值
void printHString(HString S){
int i;
for(i=0;i<S.length;i++){ //输出串值
cout<<S.ch[i]<<' ';
}
cout<<endl; //换行
}
//定位模式串匹配成功时在主串中的位置
int IndexHString(HString S,HString T,int pos){
int i=pos; //主串S中当前比较的字符位置
int j=1; //模式串T中当前比较的字符位置
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 -1; //模式串未匹配成功,返回-1
}
cout<<endl; //换行
}
int main(){
HString S,T;
int m,n,pos;
cout<<"定义主串长度为:";
cin>>m;
cout<<"请输入主串串值:";
createHString(S,m);
cout<<"输出串值验证:"<<endl;
printHString(S);
cout<<endl;
cout<<"定义模式串长度为:";
cin>>n;
cout<<"请输入模式串串值:";
createHString(T,n);
cout<<"输出串值验证:"<<endl;
printHString(T);
cout<<endl;
cout<<"输入从主串哪个字符位置开始匹配:";
cin>>pos;
cout<<"模式串中字符与主串中字符相同时,在主串的pos为:"<<IndexHString(S,T,pos);
}