KMP字符串匹配算法

来源:互联网 发布:查看1433端口是否打开 编辑:程序博客网 时间:2024/06/04 01:10
#include <iostream>
#include <string>
#include <vector>

using namespace std;

vector<int> getNext(string &patten)
{
vector<int> next(patten.size(), 0);
int curr = 0;
for (unsigned int i = 1; i < patten.size(); i++)
{
while (curr > 0 && patten[i] != patten[curr])
{
curr = next[curr-1];
}
if (patten[i] == patten[curr])
{
curr++;
}
next[i] = curr;
}
return next;
}

vector<int> findPattenByKMP(string &str, string &patten)
{
vector<int> next = getNext(patten);
vector<int> result;
unsigned int curr = 0;
for (unsigned int i = 0; i < str.size(); i++)
{
while (curr > 0 && str[i] != patten[curr])
{
curr = next[curr-1];
}
if (str[i] == patten[curr])
{
curr++;
}
if (curr == patten.size())
{
result.push_back(i-patten.size()+1);
curr = next[curr-1];
}
}
return result;
}

int main(void)
{
int n;
cin>>n;
for(int i = 0; i < n; i++)
{
string patten, str;
cin>>patten>>str;
cout<<findPattenByKMP(str, patten).size()<<endl;
}
return 0;
}
0 0
原创粉丝点击