kmp算法例题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
kmp算法例题
KMP算法是一种字符串匹配算法,用于在一个文本串S内查找一个模式串P的出现位置。
举个例子,如果文本串S为'ABCABCABC',模式串P为'ABC',那么KMP算法会返回3个匹配位置,分别为0、3和6。
KMP算法的核心是利用模式串的信息来避免在文本串中不必要的比较。具体来说,KMP算法维护一个next数组,用于记录模式串的前缀和后缀的最长公共长度。在匹配过程中,如果一个字符与模式串不匹配,那么可以跳过一定长度的字符,直接比较后面的字符。
下面是一个KMP算法的示例代码:
```
vector
int n = p.size();
vector
int j = 0;
for (int i = 1; i < n; i++) {
while (j > 0 && p[i] != p[j]) {
j = next[j - 1];
}
if (p[i] == p[j]) {
j++;
}
next[i] = j;
}
return next;
}
vector
vector
if (m == 0) {
return ans;
}
vector
int j = 0;
for (int i = 0; i < n; i++) {
while (j > 0 && s[i] != p[j]) {
j = next[j - 1];
}
if (s[i] == p[j]) {
j++;
}
if (j == m) {
ans.push_back(i - m + 1);
j = next[j - 1];
}
}
return ans;
}
```
上面的代码中,getNext函数用于计算next数组,kmp函数用于查找模式串在文本串中的出现位置。其中,i表示文本串的匹配位置,j表示模式串的匹配位置。如果当前字符匹配成功(即S[i] == P[j]),则i和j都加1,继续匹配下一个字符;否则,i不变,j回溯到next[j-1]的位置,继续匹配下一个字符。
这里需要注意的是,getNext函数中j是指前缀的末尾位置,i 是指后缀的末尾位置。在计算next数组时,如果当前字符不匹配,需要回溯到next[j-1]处重新匹配。如果next[j-1]等于0,则说明不存在长度小于j且以P[j-1]为结尾的前缀,此时需要将next[i]
赋值为0。