kmp算法c++实现
// kmp.cpp : 定义控制台应用程序的入口点。
//
#include<iostream>
#include<vector>
#include<string>
using namespace std;
int main(int argc, char* argv[])
{
string a;
string b;
cin >> a;
cin >> b;
int a_length = a.length();
int b_length = b.length();
vector<int> next(b_length, 0);
//求解next数组,跳转方式
next[0] = -1;
for (int i = 1; i < b_length; i++)
{
int j = i - 1;
while (j >-1 && b[i] != b[next[j] + 1])
{
j = next[j];
}
if (j == -1 && b[0] != b[i])
next[i] = -1;
else
next[i] = next[j] + 1;
}
//模式匹配
int a_index = 0;
int b_index = 0;
while (a_index < a_length&&b_index < b_length)
{
if (b[b_index] == a[a_index] || (b[b_index] != a[a_index]&&b_index==0))
{
a_index++;
b_index++;
}
else
{
b_index--;
while (b_index != -1&&b[b_index+1] != a[a_index])
{
b_index = next[b_index];
}
if (b_index == -1)
{
b_index = 0;
}
else
{
b_index++;
}
}
}
if (b_index == b_length)
cout << a_index << endl;
else
{
cout << "sorry" << endl;
cout << b_index << endl;
}
return 0;
}