什么是KMP算法?KMP算法是在串的模式匹配中的一个很经典很高效的算法。浙江大学陈越老师在中国MOOC上的讲授的数据结构是目前个人觉得最易懂的一个版本。下面贴上一个链接。
代码:
#include <iostream>
#include <string>
using namespace std;
#define NotFound -1
typedef int Position;
/*动态规划求Match*/
void BuildMatch (string* pattern, int* match)
{
int i, j;
int m = pattern->length(); // O(m)
match[0] = -1;
for (j = 1; j < m; j++) { // O(m)
i = match[j - 1];
while ((i >= 0) && (pattern->at(i + 1) != pattern->at(j))) { // 字符串指针不能通过数组下标遍历元素
i = match[i];
}
if (pattern->at(i + 1) == pattern->at(j)) {
match[j] = i + 1;
}
else {
match[j] = -1;
}
}
}
Position KMP (string* str, string* pattern)
{
int n = str->length(); // O(n) - 时间复杂度
int m = pattern->length(); // O(m)
int s = 0, p = 0, *match;
if (n < m) return NotFound;
match = new int[m];
BuildMatch(pattern, match); // Tm = O(m)
while (s < n && p < m) {
if (str->at(s) == pattern->at(p)) {
s++; p++;
}
else if (p > 0) {
p = match[p - 1] + 1;
}
else {
s++;
}
}
delete [] match;
return (p == m) ? (s - m) : NotFound;
}
int main ()
{
string str1, str2;
while (getline(cin, str1)) {
if (str1 == "#") {
break;
}
getline(cin, str2);
Position p = KMP(&str1, &str2);
cout << p << endl;
}
return 0;
}