欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 建筑 > KMP 算法的 C 语言实现

KMP 算法的 C 语言实现

2025/3/10 12:37:29 来源:https://blog.csdn.net/Illusionna_/article/details/146141486  浏览:    关键词:KMP 算法的 C 语言实现

 

# include <stdio.h>
# include <stdlib.h>
# include <string.h>// 打印 KMP 匹配结果.
void ColorPrint(char *T, int *result, int result_size, int m) {int green_size = strlen("\x1b[31m");int reset_size = strlen("\x1b[0m");char *color_string = (char *)malloc((strlen(T) + (green_size + reset_size) * result_size + 1) * sizeof(char));char *temp = (char *)malloc((strlen(T) + (green_size + reset_size) * reset_size + 1) * sizeof(char));strcpy(color_string, T);for (int idx = 0; idx < result_size; idx++) {strcpy(temp, color_string + result[idx] + idx * (green_size + reset_size));color_string[result[idx] + idx * (green_size + reset_size)] = '\0';strcat(color_string, "\x1b[31m");strcat(color_string, temp);strcpy(temp, color_string + result[idx] + m + green_size + idx * (green_size + reset_size));color_string[result[idx] + m + green_size + idx * (green_size + reset_size)] = '\0';strcat(color_string, "\x1b[0m");strcat(color_string, temp);}printf("%s\n", color_string);free(temp);temp = NULL;free(color_string);color_string = NULL;
}// 获得 next 数组.
int *NextArray(char *P, int m) {int *next = (int *)calloc(m, sizeof(int));int idx = 1;int prefix_length = 0;while (idx < m) {if (P[prefix_length] == P[idx]) {next[idx++] = ++prefix_length;} else {if (prefix_length == 0) {idx++;} else {prefix_length = next[prefix_length - 1];}}}return next;
}// KMP 模式匹配算法.
void KMP(char *T, char *P) {int i = 0;int j = 0;int n = strlen(T);int m = strlen(P);int *next = NextArray(P, m);int *result = NULL;int result_size = 0;while (i < n) {if (T[i] == P[j]) {i++; j++;} else {if (j == 0) {i++;} else {j = next[j - 1];}}if (j == m) {result = (int *)realloc(result, (result_size + 1) * sizeof(int));result[result_size++] = i - j;}}ColorPrint(T, result, result_size, m);free(result);result = NULL;free(next);next = NULL;
}int main(int argc, char *argv[], char *env[]) {# ifdef _WIN32system("chcp 65001");KMP("KMP 算法一直是一个比较难以理解的算法。", "算法");# elif __linux__ || __APPLE__KMP("A space Odyssey is not about the Odyssey", "s");# endifreturn 0;
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词