数据结构实现KMP字符串匹配
时间: 2023-11-26 18:02:35 浏览: 89
KMP算法是一种字符串匹配算法,可以在O(n+m)的时间复杂度内实现字符串匹配。其关键在于构建next数组,表示模式串中前缀和后缀的最长公共长度。
以下是KMP算法的实现:
```
void getNext(string pattern, vector<int>& next) {
int j = 0, k = -1;
next[0] = -1;
while (j < pattern.size() - 1) {
if (k == -1 || pattern[j] == pattern[k]) {
++j;
++k;
next[j] = k;
} else {
k = next[k];
}
}
}
int kmp(string s, string pattern) {
vector<int> next(pattern.size(), 0);
getNext(pattern, next);
int i = 0, j = 0;
while (i < s.size() && j < pattern.size()) {
if (j == -1 || s[i] == pattern[j]) {
++i;
++j;
} else {
j = next[j];
}
}
if (j == pattern.size()) {
return i - j;
}
return -1;
}
```
以上代码中,getNext函数用于构建next数组,kmp函数则用于进行字符串匹配。其中的next数组是重点,在KMP算法中,它用于跳过已经匹配过的前缀,从而提高匹配效率。
阅读全文