简单的模式匹配算法
#include<string>
#include<iostream>
using namespace std;
int Index(string a, string b) { //a为主串,b为模式串(子串)
int i = 0, j = 0;
int a_len = a.size(), b_len = b.size();
while (i < a_len && j < b_len) {
if (a[i] == b[j]) {
i++;
j++;
}
else {
i = i - j + 1;
j = 0;
}
}
if (j >= b_len) return i - b_len;
return -1;
}
int main() {
string a = "aaabaaaaaaac";
string b = "aac";
cout << Index(a, b);
return 0;
}
复杂度为O(mn)其中m为模式串长度,n为主串长度
KMP算法
#include<string>
#include<stdlib.h>
using namespace std;
int* getnext(string a) {
int i = 0, j = -1;
int len = a.size();
int* next = (int*)malloc(len * sizeof(int));
next[0] = -1;
while (i < a.size()) {
if (j == -1 || a[i] == a[j]) {
i++;
j++;
next[i] = j;
}
else
j = next[j];
}
return next;
}
int KMP(string a, string b, int next[]) {
int i = 0, j = 0;
int len_a = a.size(), len_b = b.size();
while (i < len_a && j < len_b) {
if (next[j] == -1 || a[i] == b[j]) {
i++;
j++;
}
else {
j = next[j];
}
}
if (j >= len_b) {
return i - len_b;
}
return -1;
}
复杂度为O(m+n)
看不懂强烈建议看这个视频
(优化后的next数组(待补充))
本文介绍了两种模式匹配算法:简单的线性搜索和KMP算法。简单模式匹配算法的时间复杂度为O(mn),而KMP算法通过预处理next数组优化了效率,达到O(m+n)。KMP算法利用next数组避免了不必要的回溯,提高了查找效率。
4022

被折叠的 条评论
为什么被折叠?



