朴素模式匹配算法
基于顺序存储结构实现
#include <stdio.h>
#include <iostream>
#define MaxSize 20
using namespace std;
typedef struct {
char ch[MaxSize];
int length=0;
}SString;
bool AddChar(SString &s,char c){
if(s.length==MaxSize) return false;
s.ch[s.length+1]=c;
s.length++;
return true;
}
void PrintStr(SString s){
for (int i = 1; i < s.length+1; ++i) {
printf_s("%c",s.ch[i]);
}
printf_s("\n");
}
int Index(SString s1,SString s2){ //s1为主串,s2为模式字符串
int k=1; //k作为返回的位置
int i=k,j=1; //i每次从k开始查找,j每次从头开始查找
while (i<=s1.length&&j<=s2.length){ //当有一个字符串遍历完成则退出
if(s1.ch[i]==s2.ch[j]){
i++;
j++;
} else{
k++;
j=1;
i=k;
}
}
if (j>=s2.length) //模式串遍历完成返回
return k;
return 0; //主串遍历完成返回0,说明没有找到匹配的
}
int main() {
SString str1;
SString str2;
AddChar(str1,'a');
AddChar(str1,'a');
AddChar(str1,'b');
AddChar(str1,'a');
AddChar(str1,'b');
AddChar(str2,'a');
AddChar(str2,'a');
PrintStr(str1);
PrintStr(str2);
cout << Index(str1,str2) << endl;
return 0;
}
KMP算法
#include <stdio.h>
#define MaxSize 20
using namespace std;
typedef struct {
char ch[MaxSize];
int length=0;
}SString;
bool AddChar(SString &s,char c){
if(s.length==MaxSize) return false;
s.ch[s.length+1]=c;
s.length++;
return true;
}
void PrintStr(SString s){
for (int i = 1; i < s.length+1; ++i) {
printf_s("%c",s.ch[i]);
}
printf_s("\n");
}
void GetNext(SString s,int next[]){
int i=1,j=0;
next[1]=0;
while (i<s.length)
if (j==0||s.ch[i]==s.ch[j]){
i++;j++;
next[i]=j;
} else j=next[j];
}
int Index(SString s1,SString s2){ //s1为主串,s2为模式字符串
int k=1; //k作为返回的位置
int i=k,j=1; //i每次从k开始查找,j每次从头开始查找
while (i<=s1.length&&j<=s2.length){ //当有一个字符串遍历完成则退出
if(s1.ch[i]==s2.ch[j]){
i++;
j++;
} else{
k++;
j=1;
i=k;
}
}
if (j>=s2.length) //模式串遍历完成返回
return k;
return 0; //主串遍历完成返回0,说明没有找到匹配的
}
int Index_KMP(SString s1,SString s2,int c[]){ //s1为主串,s2为模式字符串
int i=1,j=1; //i为s1指针,j为s2指针
while (i<=s1.length&&j<=s2.length){ //当有一个字符串遍历完成则退出
if(j==0||s1.ch[i]==s2.ch[j]){
i++;
j++;
} else{
j= c[j];//返回next数组中的位置
}
}
if (j>s2.length)
return i-s2.length;
return 0; //主串遍历完成返回0,说明没有找到匹配的
}
int main() {
SString str1;
SString str2;
int next[MaxSize]={0};
AddChar(str1,'a');
AddChar(str1,'b');
AddChar(str1,'a');
AddChar(str1,'b');
AddChar(str1,'a');
AddChar(str1,'b');
AddChar(str1,'a');
AddChar(str1,'a');
AddChar(str2,'a');
AddChar(str2,'b');
AddChar(str2,'a');
AddChar(str2,'b');
AddChar(str2,'a');
AddChar(str2,'a');
PrintStr(str1);
PrintStr(str2);
GetNext(str2,next);
Index(str1,str2);
Index_KMP(str1,str2,next);
printf_s("%d\n",Index_KMP(str1,str2,next));
return 0;
}