kmp模失配
时间: 2025-04-30 14:50:52 浏览: 15
### KMP算法中的模式串失配处理
KMP(Knuth-Morris-Pratt)算法是一种高效的字符串匹配算法,其核心在于通过构建部分匹配表(也称为`next`数组或`failure`函数),减少不必要的字符比较次数。当发生模式串失配时,KMP不会简单地回退到下一个位置重新开始匹配,而是利用已有的匹配信息跳过一些不可能匹配的位置。
#### 部分匹配表的作用
部分匹配表记录了模式串中前缀和后缀的最大重合长度。这种特性使得在失配情况下可以快速定位下一次可能的匹配起点,而无需重复检查已经验证过的字符[^1]。
#### 失配处理的具体过程
假设当前正在比较文本串T的第i个字符与模式串P的第j个字符,如果发现两者不相等,则执行如下操作:
1. **查找失败转移**
利用预先计算好的部分匹配表找到新的起始位置k,满足条件 `P[k..j-1]` 是最长的既是前缀又是后缀的子串。
2. **更新指针**
将模式串的指针调整至新位置k继续尝试匹配,即令 `j = next[j-1]`,其中`next[]`表示部分匹配表。
3. **特殊情况**
如果到达模式串的第一个字符仍然无法匹配,则移动文本串指针向前推进一位并重新开始匹配。
以下是实现上述逻辑的一个典型代码片段:
```cpp
void computeLPSArray(const string& pat, int M, vector<int>& lps) {
int len = 0;
lps[0] = 0; // lps[0] is always 0
int i = 1;
while (i < M) {
if (pat[i] == pat[len]) {
len++;
lps[i] = len;
i++;
} else {
if (len != 0) {
len = lps[len - 1];
} else {
lps[i] = 0;
i++;
}
}
}
}
bool KMPSearch(const string& pat, const string& txt) {
int M = pat.size();
int N = txt.size();
vector<int> lps(M);
computeLPSArray(pat, M, lps);
int j = 0; // index for pat[]
for (int i = 0; i < N;) {
if (pat[j] == txt[i]) {
j++; i++;
}
if (j == M) {
return true; // Match found
j = lps[j - 1]; // Prepare for the next match
}
// Mismatch after j matches
else if (i < N && pat[j] != txt[i]) {
if (j != 0)
j = lps[j - 1];
else
i++;
}
}
return false;
}
```
此代码展示了如何基于部分匹配表来高效处理失配情况,并恢复到一个新的候选位置进行进一步匹配。
阅读全文
相关推荐



















