-
SqString.h
#include
#include
#include
#include
#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(iif(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-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(iif(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
#include "SqString.h"
using namespace std;
int main() {
SqString s,t;
int a,a1,i;
ElemType e1,e2;
InitIndex(s);
InitIndex(t);
cout<<"请输入主串个数:"<>a;
for(i=0;i"请输入主串的元素:";
cin>>e1;
s.data[i]=e1;
}
for(i=0;i" ";
}
cout<"请输入子串个数:"<>a1;
for(i=0;i"请输入子串的元素:";
cin>>e2;
t.data[i]=e2;
}
for(i=0;i" ";
}
cout<"采用BF算法"<"第一个匹配的字符下标为:";
Index(s,t);
cout<"采用KMP算法"<"第一个匹配的字符下标为:";
KMPIndex(s,t);
return 0;
}
两个问题,一是你没有给s和t的length赋值啊
二是你调用Index(s,t)后,要获得它的返回值,然后如果返回值大于等于0,表示有匹配项,然后输出这个返回值
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;
}
s.length = a;
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;
}
t.length = a1;
for(i=0;i<a1;i++){
cout<<t.data[i]<<" ";
}
cout<<endl;
cout<<"采用BF算法"<<endl;
cout<<"第一个匹配的字符下标为:";
int n = Index(s,t);
if(n>=0)
cout<<n;
cout<<endl;
cout<<"采用KMP算法"<<endl;
cout<<"第一个匹配的字符下标为:";
n = KMPIndex(s,t);
if(n>=0)
cout<<n<<endl;
return 0;
}
有啥异常现象啊?
101.109 ,111行输出符你少打了一个。
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!