#include <iostream>
#include <vector>
using namespace std;
template<class T>
void print_vector(vector<int> input)
{
for(auto it=input.begin(); it!=input.end(); ++it)
{
cout<<*it<<" ";
}
cout<<endl;
}
vector<int> NEXT_v2(const string &partten)
{
vector<int> next(partten.size());
int k=-1;
int i=0;
next[0]=-1;
while(i<partten.size())
{
if(k==-1 || partten[i]== partten[k])
{
if(partten[++i]==partten[++k])
{
next[i]=next[k];
}
else
{
next[i]=k;
}
}
else
{
k=next[k];
}
}
return next;
}
vector<int> NEXT(const string &partten)
{
vector<int> next(partten.size());
int k=-1;
int i=0;
next[0]=-1;
while(i<partten.size())
{
if(k==-1 || partten[i]== partten[k])
{
next[++i]=++k;
}
else
{
k=next[k];
}
}
return next;
}
/*
AB0123456789AAAABCD11
------------AAAABCD
0123456789012
*/
int main()
{
string str("AB0123456789AAAABCD11");
string partten("AAAABCD");
int str_index=0,partten_index=0;
vector<int> next=NEXT(partten);
print_vector<int>(next);
vector<int> next_v2=NEXT_v2(partten);
print_vector<int>(next_v2);
while( partten_index!=partten.size() && str_index!=str.size() )
{
if(str[str_index]==partten[partten_index])
{
str_index++;
partten_index++;
}
else
{
if(partten_index==0)
{
str_index++;
}
else
{
partten_index=next[partten_index];
}
}
}
//匹配成功,返回下标
if(partten_index==partten.size())
{
cout<<str_index-partten_index<<endl;
}
else
{
cout<<"Not Found!\n"<<endl;
}
return 0;
}
【day-13】KMP完整版+升级版
最新推荐文章于 2023-10-28 11:38:58 发布