kmp算法例题

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

kmp算法例题

KMP算法是一种字符串匹配算法,用于在一个文本串S内查找一个模式串P的出现位置。

举个例子,如果文本串S为'ABCABCABC',模式串P为'ABC',那么KMP算法会返回3个匹配位置,分别为0、3和6。

KMP算法的核心是利用模式串的信息来避免在文本串中不必要的比较。具体来说,KMP算法维护一个next数组,用于记录模式串的前缀和后缀的最长公共长度。在匹配过程中,如果一个字符与模式串不匹配,那么可以跳过一定长度的字符,直接比较后面的字符。

下面是一个KMP算法的示例代码:

```

vector getNext(string p) {

int n = p.size();

vector next(n, 0);

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 kmp(string s, string p) { int n = s.size(), m = p.size();

vector ans;

if (m == 0) {

return ans;

}

vector next = getNext(p);

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。

相关文档
最新文档