C++版字符串匹配算法之传统匹配算法加KMP字符串匹配算法

 

#include <iostream>
#include <string>
#define MAXSIZ 100
using namespace std;
class Match{
public:
 Match(){
  size=0;
  str="";
 }
 Match(string st){
  size=st.length();
  str=st;
 }
 void Set(string st){
  size=st.length();
  str=st;
 }
 ~Match(){}
 void NormalMatch(string &)const;
 void CreateNext(string &);
 void KMPMatch(string &)const;
private:
 int next[MAXSIZ];
 int size;
 string str;
};
void Match::NormalMatch(string &dest)const{
 int i=0,j=0;
 while(i<str.length()-dest.length()+1&&j<dest.length()){
  if(dest[j]==str[i]){
   i++;
   j++;
  }
  else{
   i=i-j+1;
   j=0;
  }
 }
 if(j==dest.length()){
  cout<<"NormalMatch sucess!"<<endl;
  cout<<"Start from No."<<i-j+1<<" letter."<<endl;
  return;
 }
 else cout<<"NormalMatch failed!"<<endl;
 return;
}
void Match::CreateNext(string &dest){
 int k=-1,j=0;
 next[0]=-1;
 while(j<dest.length()){
  if(dest[k]==dest[j]||k==-1){
   k++;
   j++;
   next[j]=k;
  }
  else k=next[k];
 }
 /*int i=0;
 while(i<size)cout<<next[i++];
 cout<<endl;*/
}
void Match::KMPMatch(string &dest)const{
 int i=0,j=0;
 while(i<str.length()&&j<dest.length()){
  if(str[i]==dest[j]||j==-1){
   i++;
   j++;
  }
  else
   j=next[j];
 }
 if(j==dest.length()){
  cout<<"KMPMatch sucess!"<<endl;
  cout<<"Start from No."<<i-j+1<<" letter."<<endl;
  return;
 }
 else cout<<"KMPMatch failed!"<<endl;
 return;
}
void main(){
 Match obj;
 string res,dest;
 cout<<"Input the res string:"<<endl;
 cin>>res;
 obj.Set(res);
 cout<<"Input the dest string:"<<endl;
 cin>>dest;
 obj.NormalMatch(dest);
 obj.CreateNext(dest);
 obj.KMPMatch(dest);
}
 


 

你可能感兴趣的:(C++版字符串匹配算法之传统匹配算法加KMP字符串匹配算法)