KMP 算法的 C 语言实现

server/2025/3/10 11:25:32/

 

# 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;
}


http://www.ppmy.cn/server/173921.html

相关文章

优维眼中的Manus:AI工程化思维重构Agent的运维端启示

继DeepSeek后&#xff0c;中国AI叕特么行了&#xff01; 2025年3月6日&#xff0c;AI行业被两则消息同时点燃&#xff1a;一边是阿里开源QwQ-32B模型以极简参数追平顶尖闭源产品&#xff0c;另一边则是名不见经传的Monica团队推出通用Agent产品Manus&#xff0c;在GAIA基准测试…

解锁AIGC新时代:通义万相2.1与蓝耘智算平台的完美结合引领AI内容生成革命

前言 通义万相2.1作为一个开源的视频生成AI模型&#xff0c;在发布当天便荣登了VBench排行榜的榜首&#xff0c;超越了Sora和Runway等业内巨头&#xff0c;展现出惊人的潜力。模型不仅能够生成1080P分辨率的视频&#xff0c;而且没有时长限制&#xff0c;能够模拟自然动作&…

泛型、泛型上限、泛型下限、泛型通配符

DAY8.1 Java核心基础 泛型 Generics 是指在类定义时不指定类中信息的具体数据类型&#xff0c;而是用一个标识符来代替&#xff0c;当外部实例化对象时再指定具体的数据类型。 在定义类或者接口时不明确指定类中信息的具体数据类型&#xff0c;在实例化时再来指定具体的数据类…

基于单片机的室外休闲智能座椅设计(论文+源码)

1系统总体设计 本课题为基于单片机的室外休闲智能座椅的设计&#xff0c;其可以实现温湿度检测&#xff0c;座椅加热&#xff0c;自动照明&#xff0c;背靠调节等工作。整个系统架构如图2.1所示其中包括了按键模块&#xff0c;温湿度检测模块&#xff0c;显示模块&#xff0c;加…

[FE] React 初窥门径(五):React 组件的加载过程(commit 阶段)

1. 回顾 前一篇文章我们看到&#xff0c;ReactDOM.render 总共包含这些步骤&#xff0c; 然后介绍了 performSyncWorkOnRoot 做的事情&#xff0c;它主要做了两件事&#xff0c; renderRootSync 可称之为 render 阶段&#xff1a;创建了一颗 Fiber Tree&#xff08;包含 html …

【HarmonyOS Next】鸿蒙应用故障处理思路详解

【HarmonyOS Next】鸿蒙应用崩溃处理思路详解 一、崩溃问题发现后定位 1. 崩溃现象&#xff1a; 常见的崩溃问题表现为&#xff0c;应用操作后白屏闪退&#xff0c;或者应用显示无响应卡死。 2.定位问题&#xff1a; 发现崩溃后&#xff0c;我们首先需要了解复现步骤&#x…

信息安全基石:深入解析CIA三元组(机密性、完整性、可用性)

1. 什么是CIA三元组&#xff1f; **CIA三元组&#xff08;CIA Triad&#xff09;**是信息安全领域的核心模型&#xff0c;定义了信息保护的三大核心目标&#xff1a; Confidentiality&#xff08;机密性&#xff09; Integrity&#xff08;完整性&#xff09; Availability&…

51单片机Proteus仿真速成教程——P1-软件与配置+Proteus绘制51单片机最小系统+新建程序模版

前言&#xff1a;本文主要围绕 51 单片机最小系统的绘制及程序模板创建展开。首先介绍了使用 Proteus 绘制 51 单片机最小系统的详细步骤&#xff0c;包括软件安装获取途径、工程创建、器件添加&#xff08;如单片机 AT89C51、晶振、电容、电阻、按键等&#xff09;、外围电路&…