KMP算法是什么?利用c++实现该算法
时间: 2023-08-31 12:44:12 浏览: 113
KMP算法(C++实现)
### 回答1:
KMP算法是一种字符串匹配算法,用于在一个文本串中查找一个模式串的出现位置。它通过利用模式串的部分匹配信息,可以大大减少匹配的次数,提高匹配效率。
下面是一个使用C语言实现KMP算法的例子:
```
#include <stdio.h>
#include <string.h>
void getNext(char *pattern, int *next)
{
int len = strlen(pattern);
next[0] = -1;
int k = -1;
int j = 0;
while (j < len - 1)
{
if (k == -1 || pattern[k] == pattern[j])
{
++k;
++j;
next[j] = k;
}
else
{
k = next[k];
}
}
}
int KMP(char *text, char *pattern)
{
int len1 = strlen(text);
int len2 = strlen(pattern);
int *next = (int *)malloc(sizeof(int) * len2);
getNext(pattern, next);
int i = 0;
int j = 0;
while (i < len1 && j < len2)
{
if (j == -1 || text[i] == pattern[j])
{
++i;
++j;
}
else
{
j = next[j];
}
}
if (j == len2)
{
return i - len2;
}
else
{
return -1;
}
}
int main()
{
char text[] = "ababababca";
char pattern[] = "abababca";
int index = KMP(text, pattern);
printf("index: %d\n", index);
return 0;
}
```
在这个例子中,函数getNext用于预处理模式串的next数组,next数组表示当前位置之前的子串中,有多少个字符和当前位置的子串匹配。这个信息可以用来跳过不必要的匹配,从而提高匹配
### 回答2:
KMP算法,即Knuth-Morris-Pratt算法,是一种字符串匹配算法,其主要目的是在一个主串中找到一个模式串的出现位置。KMP算法通过对模式串的前缀和后缀进行匹配来跳过一些不必要的比较,从而提高匹配效率。
具体实现KMP算法的步骤如下:
1. 预处理,构建一个部分匹配表,用于记录模式串中每个子串的最长前缀和后缀的长度。部分匹配表可以帮助我们确定在不匹配时模式串需要向右移动的距离。
2. 在主串中进行匹配,通过比较主串和模式串的字符来进行匹配。如果匹配成功,模式串继续向右移动,同时匹配成功的数量加1;如果匹配失败,则利用部分匹配表计算模式串需要向右移动的距离,并进行移动。
以下是用C语言实现KMP算法的示例代码:
```
#include<stdio.h>
#include<string.h>
// 构建部分匹配表
void buildPartialMatchTable(const char *pattern, int *table) {
int len = strlen(pattern);
int i = 0, j = -1;
table[0] = -1;
while (i < len) {
if (j == -1 || pattern[i] == pattern[j]) {
i++;
j++;
table[i] = j;
} else {
j = table[j];
}
}
}
// KMP匹配
int kmp(const char *text, const char *pattern) {
int textLen = strlen(text);
int patternLen = strlen(pattern);
int i = 0, j = 0;
int *table = new int[patternLen];
buildPartialMatchTable(pattern, table);
while (i < textLen) {
if (j == -1 || text[i] == pattern[j]) {
i++;
j++;
} else {
j = table[j];
}
if (j == patternLen) {
delete[] table;
return i - j;
}
}
delete[] table;
return -1;
}
int main() {
const char *text = "AABACAABABACAA";
const char *pattern = "ABAB";
int index = kmp(text, pattern);
if (index != -1) {
printf("Pattern found at index %d\n", index);
} else {
printf("Pattern not found\n");
}
return 0;
}
```
以上是KMP算法的简单介绍和用C语言实现的示例代码。通过构建部分匹配表和利用该表进行匹配,KMP算法可以在一个主串中高效地查找模式串的出现位置。
### 回答3:
KMP算法(Knuth-Morris-Pratt算法)是一种字符串匹配算法,用于在一个主字符串中查找一个给定的模式字符串。与朴素的字符串匹配算法相比,KMP算法具有更高的效率。
该算法的核心思想是利用已匹配的部分信息来避免不必要的比较。首先,通过预处理模式字符串,生成一个部分匹配表(partial match table),记录了模式字符串中前缀与后缀的最长公共部分长度。然后,在匹配过程中,通过对模式字符串和主字符串进行逐个字符的比较,当出现不匹配的情况时,根据部分匹配表中的信息,调整模式字符串的对齐位置,从而实现跳跃式的匹配。
以下是利用C语言来实现KMP算法的示例代码:
```c
#include <stdio.h>
#include <string.h>
void partialMatchTable(char* pattern, int* table) {
int len = strlen(pattern);
table[0] = 0;
int i = 1;
int j = 0;
while (i < len) {
if (pattern[i] == pattern[j]) {
j++;
table[i] = j;
i++;
} else {
if (j != 0) {
j = table[j-1];
} else {
table[i] = 0;
i++;
}
}
}
}
void KMP(char* str, char* pattern) {
int lenStr = strlen(str);
int lenPattern = strlen(pattern);
int* table = (int*)malloc(lenPattern * sizeof(int));
partialMatchTable(pattern, table);
int i = 0;
int j = 0;
while (i < lenStr) {
if (str[i] == pattern[j]) {
i++;
j++;
}
if (j == lenPattern) { // 匹配成功
printf("Pattern found at index: %d\n", i - j);
j = table[j-1];
} else if (i < lenStr && str[i] != pattern[j]) { // 不匹配
if (j != 0) {
j = table[j-1];
} else {
i++;
}
}
}
free(table);
}
int main() {
char str[] = "ABCABCDABABCDABCDABDE";
char pattern[] = "ABCDABD";
KMP(str, pattern);
return 0;
}
```
此代码实现了KMP算法,首先通过`partialMatchTable`函数构建了部分匹配表,然后在`KMP`函数中进行字符串匹配,输出匹配成功的索引位置。在主函数中,我们使用了一个示例字符串和模式字符串进行测试,输出的结果是模式字符串在主字符串中的匹配位置。
阅读全文