一、暴力匹配
#include <iostream>
using namespace std;
#define MAXLEN 255
typedef struct{
char ch[MAXLEN];
int length;
}SString;
//S为主串,T为子串
//暴力匹配
int Index(SString S,SString T){
int i=1,j=1;
int k=1;
while(i<=S.length && j<=T.length){
if(S.ch[i]==T.ch[j]){
i++;
j++;
}else{
// i的第二种取值
// k++;
// i=k;
i=i-j+2;
j=1;
}
}
if(j>T.length)
return i-T.length;
else
return 0;
}
二、KMP算法——next数组
#include <iostream>
using namespace std;
#define MAXLEN 255
typedef struct{
char ch[MAXLEN];
int length;
}SString;
//S为主串,T为子串
//KMP-next
int Index_KMP(SString S,SString T,int next[]){
int i=1,j=1;
while(i<=S.length&&j<=T.length){
if(j==0||S.ch[i]==T.ch[j]){
i++;
j++;
}
else{
j=next[j];
}
}
if(j>T.length)
return i-T.length;
else
return 0;
}
三、nextval数组的求法
//next->nextval
void get_nextval(SString T,int nextval[],int next[]){
nextval[1]=0;
for(int j=2;j<=T.length;j++){
if(T.ch[next[j]]==T.ch[j])
nextval[j]=nextval[next[j]];
else
nextval[j]=next[j];
}
}
然后把KMP算法中的next数组替换成nextval数组即可,匹配算法不变。