目前个人觉得最易懂的一个KMP算法讲解
什么是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; }