大きな話のデータ構造——KMPアルゴリズム(まだ問題があります)
2348 ワード
http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.
/*#include<iostream>
#include <string>
using namespace std;
int count_same_char(string T,int j);
void get_next(string T,int *next)
{
int j=1;
next[1]=0;
for(int k=2;k<=T.size();++k)
{
next[k]=count_same_char(T,k)+1;
}
}
// T 0 j-1 ,
// 0
int count_same_char(string T,int j)
{
j=j-1;
int cout_number=0;
int director=0;
for(int i=(j/2);i>=1;i--)//
{
for(int k=0;k<i;k++)
{
if(T[k]!=T[j-i+k])
{director=0;break;}
director=1;
}
if(director==1)
{cout_number=i;break;}
}
return cout_number;
}
int main()
{
string T="ababaaaba";
int next[10];
get_next(T,next);
for(int i=1;i<=T.size();++i)
{
cout<<next[i]<<' ';
}
cout<<endl;
/*string T="abcabx";
cout<<count_same_char(T,6)<<endl;
*/
/*
system("pause");
return 1;
}*/
#include<iostream>
#include <string>
using namespace std;
int get_number(string T,int j);
void get_char_number(string T,int *next)
{
next[0]=0;
int K=T.size();
for(int i=1;i<K;i++)
{
next[i]=get_number(T,i);
}
}
int get_number(string T,int j)
{
int count_number=0;
int i,k,temp;
for(k=(j+1)/2;k>=1;k--)
{
temp=0;
for(i=0;i<k;i++)
{
if(T[i]!=T[j-k+i+1])
{temp=1;break;}
}
if(temp==0)
{count_number=k;break;}
}
return count_number;
}
int KMP(string S,string T)
{
int next[100];
int result[100];
get_char_number(T,next);
if(T.size()>S.size())
return -1;
int i=0;// S
while(i<=(S.size()-T.size()))
{
int j,temp=1;
for(j=0;j<T.size();j++)
{
if(T[j]!=S[i+j])
{temp=0;break;}
}
if(temp=1)
return i;
if(j==0)
i++;
i=i+j-next[j-1];
}
return -1;
}
int main()
{
/*
string T="jkl";
//cout<<get_number(T,4)<<endl;
int next[10];
get_char_number(T,next);
for(int i=0;i<T.size();i++)
cout<<next[i]<<' ';
cout<<endl;
*/
string S="fghjkl";
string T="jkl";
cout<<KMP(S,T)<<endl;
system("pause");
return 1;
}