简单模式匹配
这是一种不依赖于其他串操作的暴力匹配算法:
#include <iostream>
#include <windows.h>
using namespace std;
#define MAXLEN 255
template<class T>
struct st{
T ch[MAXLEN];
int length;
};
template<class T>
int answer1(st<T> s1,st<T> s2){
int i = 0,j = 0;
while(i<=s1.length && j <= s2.length){
if(s1.ch[i] == s2.ch[j]){
i++;j++;
}
else{
i = i - j + 1;
j = 0;
}
cout<<endl;
}
//出来代表i或者j有一个走到头了,如果s2遍历完以后出来,就是找到了,反之就算没找到。
if(j > s2.length) return i - s2.length;//返回第一个字母的位置
else return 0;
}
int main(){
char a1[] = "ababcabcacbababc";
char a2[] = "abcac";
st<char> s1;strcpy(s1.ch, a1);s1.length = 15;
st<char> s2;strcpy(s2.ch, a2);s2.length = 4;//减去最后一个空格,空格不能参与比较
cout<<answer1(s1,s2);
system("pause");
return 0;
}
改进的模式匹配算法-KPM算法
#include <iostream>
#include <windows.h>
using namespace std;
#define MAXLEN 255
template<class T>
struct st{
T ch[MAXLEN];
int length;
};
template<class T>
void get_next(st<T> a,int next[]){
int i = 0,j = -1;
next[0] = -1;
while(i<a.length){
if(j==-1||a.ch[i] == a.ch[j]){
++i;++j;
next[i] = j;
}
else j = next[j];
}
}
template<class T>
int Index_KMP(st<T> s1,st<T> s2,int next[]){
int i = 0, j = 0;
while(i<s1.length&&j<s2.length){
cout<<"as this timei="<<i<<"j="<<j;
if(j==-1||s1.ch[i] == s2.ch[j]){
++i;++j;
cout<<" searching ";
}
else{ j=next[j];cout<<" next ";
}
cout<<endl;
}
if(j>s1.length) return i=s2.length;
else return 0;
}
int main(){
char a1[] = "ababcabcacbababc";
char a2[] = "abaabcaba";
st<char> s1;strcpy(s1.ch, a1);s1.length = 16;
st<char> s2;strcpy(s2.ch, a2);s2.length = 9;//减去最后一个空格,空格不能参与比较
const int num = s2.length + 1;
int next[num];
get_next(s2,next);
cout<<Index_KMP(s1,s2,next);
system("pause");
return 0;
}
改进的KMP算法
#include <iostream>
#include <windows.h>
using namespace std;
#define MAXLEN 255
template<class T>
struct st{
T ch[MAXLEN];
int length;
};
template<class T>
void get_next(st<T> a,int next[]){
int i = 0,j = -1;
next[0] = -1;
while(i<a.length){
if(j==-1||a.ch[i] == a.ch[j]){
++i;++j;
if(a.ch[i] == a.ch[j]) next[i] = next[j];
else
next[i] = j;
}
else j = next[j];
}
}
template<class T>
int Index_KMP(st<T> s1,st<T> s2,int next[]){
int i = 0, j = 0;
while(i<s1.length&&j<s2.length){
cout<<"as this timei="<<i<<"j="<<j;
if(j==-1||s1.ch[i] == s2.ch[j]){
++i;++j;
cout<<" searching ";
}
else{ j=next[j];cout<<" next ";
}
cout<<endl;
}
if(j>s1.length) return i=s2.length;
else return 0;
}
int main(){
char a1[] = "ababcabcacbababc";
char a2[] = "abaabcaba";
st<char> s1;strcpy(s1.ch, a1);s1.length = 16;
st<char> s2;strcpy(s2.ch, a2);s2.length = 9;//减去最后一个空格,空格不能参与比较
const int num = s2.length + 1;
int next[num];
get_next(s2,next);
cout<<Index_KMP(s1,s2,next);
system("pause");
return 0;
}
335

被折叠的 条评论
为什么被折叠?



