【问题描述】KMP算法是字符串模式匹配算法中较为高效的算法之一,其在某次子串匹配母串失败时并未回溯母串的指针而是将子串的指针移动到相应的位置。
【输入形式】1组字符串,每组字符串占一行。每行包含由空格分隔的两个字符串,字符串仅由英文小写字母组成且长度不大于100。
【输出形式】每组数据输出1行,输出后一个字符串在前一个字符串中的位置,如果不匹配,则输出0。
【样例输入】
thisisalongstring isa
【样例输出】
5
【提示】表示字符串的数据结构可以是字符数组或用串类实现。KMP算法调用很简单,但难的是理解算法的思想。掌握算法的思想才能说是掌握算法。
#include <bits/stdc++.h>
using namespace std;
void getNext(int *next, const string &s)
{
int j = 0, i;
next[0] = 0;
for (int i = 1; i < s.size(); i++)
{
while (j > 0 && s[i] != s[j])
{
j = s[j - 1];
}
if (s[i] == s[j])
j++;
next[i] = j;
}
}
int strStr(string s, string sub)
{
int next[sub.size()];
int j = 0;
getNext(next, sub);
for (int i = 0; i < s.size(); i++)
{
while (j > 0 && sub[j] != s[i])
{
j = next[j - 1];
}
if (sub[j] == s[i])
j++;
if (j == sub.size())
return i - j + 2;
}
return 0;
}
int main()
{
string a, b;
cin >> a >> b;
cout << strStr(a, b);
}