您的位置:首页 > 其它

KMP 算法 字符串比较

2014-09-01 19:23 274 查看
/*
KMP algorithm http://www.cnblogs.com/dolphin0520/archive/2011/08/24/2151846.html */
#include<iostream>
#include<string>
using namespace std;

// 普通的字符串比较函数
int compare(string s1,string s2)
{
int i=0,j=0;
while(i<(s1.length()-s2.length()) )
{

while(s1[i]==s2[j] )
{

cout<<"s1["<<i<<"]"<<s1[i]<<endl;
cout<<"s2["<<j<<"]"<<s2[j]<<endl;
i++;
j++;
if (s2.length()==j)
{
//return i-s2.length();
cout<<"right"<<endl;
return 1;
}
}
i=i-j+1;
j=0;
}
return 0;
}

/*KMP得到下一个值
根据定义next[0]=-1,假设next[j]=k, 即P[0...k-1]==P[j-k,j-1]
1)若P[j]==P[k],则有P[0..k]==P[j-k,j],很显然,next[j+1]=next[j]+1=k+1;
2)若P[j]!=P[k],则可以把其看做模式匹配的问题,即匹配失败的时候,k值如何移动,
显然k=next[k]
*/
void getNext_recursion(string s2,int next[])
{
int j=0,k=-1;
next[0]=-1;
while (j<s2.length()-1)
{
if (k==-1||s2[j]==s2[k])
{
j++;
k++;
next[j]=k;//next[j++]=k++;
}
else
k=next[k];
}
}

int KMP(string s1,string s2)
{
int next[100];
getNext_recursion(s2,next);
int i=0,j=0;
while(i<s1.length() )
{
if(j==-1||s1[i]==s2[j])
{
i++;
j++;
}
else
{
j=next[j];
}

if (s2.length()==j)
{
return i-j;
}

}
return 0;

}
int main()
{

string s1="ababcababa",s2="ababa";
/*cout<<"请输入text值"<<endl;
cin>>s1;
cout<<"请输入query值"<<endl;
cin>>s2;*/
cout<<s1<<endl;
cout<<s2<<endl;
//cout<<compare(s1,s2);
cout<<KMP(s1,s2);
cout<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: