-
SqString.h
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#include <iostream>
#define MAXSIZE 100
#define ElemType char
using namespace std;
typedef struct
{
ElemType data[MAXSIZE];
int length;
}SqString;
//初始化
void InitIndex(SqString &s){
s.length=0;
}
//BF
int Index(SqString &s,SqString &t){
int i=0,j=0;
while(i<s.length&&j<t.length){
if(s.data[i]==t.data[j]){
i++;
j++;
}else{
i=i-j+1;
j=0;
}
}
if(j>=t.length){
return (i-t.length);
}else{
return (-1);
}
}
//next
void GetNext(SqString &t,int next[]){
int j=0,k=-1;
next[0]=-1;
while(j<t.length-1){
if(k==-1||t.data[j]==t.data[k]){
j++;
k++;
next[j]=k;
}else{
k=next[k];
}
}
}
//KMP
int KMPIndex(SqString &s,SqString &t){
int i=0,j=0,next[MAXSIZE];
GetNext(t,next);
while(i<s.length&&j<t.length){
if(j==-1||s.data[i]==t.data[j]){
j++;
i++;
}else{
j=next[j];
}
}
if(j>=t.length){
return (i-t.length);
}else{
return (-1);
}
}
#include <iostream>
#include "SqString.h"
using namespace std;
int main() {
SqString s,t;
int a,a1,i;
ElemType e1,e2;
InitIndex(s);
InitIndex(t);
cout<<"请输入主串个数:"<<endl;
cin>>a;
for(i=0;i<a;i++){
cout<<"请输入主串的元素:";
cin>>e1;
s.data[i]=e1;
}
for(i=0;i<a;i++){
cout<<s.data[i]<<" ";
}
cout<<endl;
cout<<"请输入子串个数:"<<endl;
cin>>a1;
for(i=0;i<a1;i++){
cout<<"请输入子串的元素:";
cin>>e2;
t.data[i]=e2;
}
for(i=0;i<a1;i++){
cout<<t.data[i]<<" ";
}
cout<<endl;
cout<<"采用BF算法"<<endl;
cout<<"第一个匹配的字符下标为:";
Index(s,t);
cout<<endl;
cout<<"采用KMP算法"<<endl;
cout<<"第一个匹配的字符下标为:";
KMPIndex(s,t);
return 0;
}