字符串匹配
1.BF匹配
#include"iostream"
using namespace std;
string s,p;
int bf(){
int i,j;
i = j = 0;
int li = s.length();
int lp = p.length();
while(i < li && j < lp)
{
if(s[i] == p[j])
{
// cout<<s[i];
i++;
j++;
}
else
{
i = i - j + 1;
j = 0;
}
}
if(j >= lp)
return i - lp;
else
return 0;
}
int main()
{
//cout<<"输入字符串s和p:\n";
//ababcabcacbab
//abcac
s = "ababcabcacbab";
p = "abcac";
//int a = bf();
cout<<bf()+1<<endl;
}
2.KMP
(1)数组下标从1开始
#include"iostream"
using namespace std;
int next_k[100];
void getnext_k(string t)
{
int i,j;
int len = t.length();
cout<<"模式串长度:"<<len-1<<endl;
next_k[1] = 0;
i = 1;j = 0;
while(i < len-1)
{
if(j == 0 || t[i] == t[j])
{
i++;
j++;
if(t[i]!=t[j])
next_k[i] = j;
else
next_k[i] = next_k[j];
}
else
j = next_k[j];
}
}
int index_Kmp(string s,string t,int pos)
{
int i = pos ,j = 1;
while(i <= s.length()-1 && j <= t.length()-1)
{
if( j==0 || s[i]==t[j])
{
i++;
j++;
}
else
j = next_k[j];
}
if(j > t.length()-1)
return i - t.length()+1;
else
return 0;
}
int main()
{
string s,p;
//意第一个位置开始,随意空一格
s=" ababcabcacbab";
p=" abcac";
//cin>>s>>p;
//p="qaaaab" ;
getnext_k(p);
int index = index_Kmp(s,p,1);
for(int i=1;i<=p.length()-1;i++)
cout<<next_k[i]<<endl;
cout<<"位置为:"<<index;
}
(2)数组下表从0开始
#include"iostream"
#include<cmath>
using namespace std;
int next_k[100];
void getNext(string t)
{
int len = t.length();
int i,j;
next_k[0] = -1;
i = 0;j = -1;
while(i < len)
{
if(j == -1 || t[i] == t[j])
{
i++;
j++;
if(t[i]!=t[j])
next_k[i] = j;
else
next_k[i] = next_k[j];
}
else
j = next_k[j];
}
}
int index_Kmp(string s,string t,int pos)
{
int i = pos ,j = 0;
int s_len = s.length(),t_len = t.length();
//这里有个小坑,当用j<t.length()直接判断时,当j=-1的话,会判断不出来,而j>=0时可以正常判断.用sizeof(t.length())得到8字节,
while(i<s_len&& j<t_len)
{
if(j == -1 || s[i] == t[j])
{
i++;
j++;
}
else
j = next_k[j];
// cout<<"s.len="<<s.length()<<",t.len="<<t.length()<<endl;
// cout<<"i="<<i<<",j="<<j<<endl;
}
cout<<"循环结束";
//cout<<"j="<<j<<endl;
if(j == t.length())
return i - j;
else
return -1;
}
int main()
{
string s,p;
// s="ababcabcacbab";
// p="abcac";
s="aksfygjasfv";
p="asf";
//cin>>s>>p;
getNext(p);
for(int i=0;i<p.length();i++)
cout<<next_k[i]<<endl;
int index = index_Kmp(s,p,0);
cout<<"位置:"<<index + 1;
}

浙公网安备 33010602011771号