当前位置: 首页 > news >正文

【数据结构-KMP算法(学习篇)】

数据结构-KMP算法(学习篇)

  • KMP算法核心

KMP算法核心

KMP 的两次 “回溯” 本质是针对不同目标的指针回退,且都围绕next数组联动,具体区别如下
在这里插入图片描述

另外附上代码 有需要的小伙伴可以放心取走
在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define MAXSIZE 255
typedef struct{char *s; // 主串char *t; // 模式串
}KMPTest,*KMPTestPtr;// 构造字符串
void createString(KMPTest *str){// 分别分配内存str->s = (char*)malloc(sizeof(char) * MAXSIZE);str->t = (char*)malloc(sizeof(char) * MAXSIZE);if(str->s == NULL || str->t == NULL){printf("内存分配失败!\n");exit(1);}// 输入主串printf("请输入主串(不超过255个字符): ");fgets(str->s, MAXSIZE, stdin);// 去除fgets带来的换行符str->s[strcspn(str->s, "\n")] = '\0';// 输入模式串printf("请输入模式串(不超过255个字符): ");fgets(str->t, MAXSIZE, stdin);str->t[strcspn(str->t, "\n")] = '\0';
}// 求模式串的next数组
void getNext(char *t, int *next){int i = 0;      // 模式串指针,从0开始next[0] = -1;   // 第一个字符的next值为-1int j = -1;     // 最长前缀后缀长度int len = strlen(t); // 模式串长度 索引 0-len-1while(i < len - 1){// 当j为-1或当前字符匹配时,i和j同时后移if(j == -1 || t[i] == t[j]){i++;j++; next[i] = j;} else {j = next[j]; // 回溯}}for(int k = 0; k < len; k++){printf("next[%d] = %d\n", k, next[k]);}
}// KMP算法
int KMP(KMPTest str){int i = 0; // 主串指针int j = 0; // 模式串指针int sLen = strlen(str.s); // 主串长度int tLen = strlen(str.t); // 模式串长度// 若模式串为空或主串长度小于模式串长度,直接返回-1if(tLen == 0 || sLen < tLen) return -1; // 创建并获取next数组int *next = (int*)malloc(sizeof(int) * tLen);// 构建next数组getNext(str.t, next);// KMP匹配过程while(i < sLen && j < tLen){if(j == -1 || str.s[i] == str.t[j]){i++;j++;} else {j = next[j]; // 模式串回溯}}free(next); // 释放next数组内存// 若模式串匹配完成,返回匹配起始位置if(j == tLen){return i - j;} else {return -1; // 未找到匹配}
}void test(){KMPTestPtr str = (KMPTestPtr)malloc(sizeof(KMPTest));createString(str);printf("主串为: %s\n", str->s);printf("模式串为: %s\n", str->t);// 执行KMP算法 返回匹配位置int position = KMP(*str);if(position != -1){printf("模式串在主串中的起始位置为: %d (从0开始计数)\n", position);} else {printf("主串中未找到模式串\n");}// 释放内存 依次释放free(str->s);free(str->t);free(str);
}int main(){test();return 0;
}

文章转载自:

http://mpJT7Xxq.hffjj.cn
http://cT8UUouN.hffjj.cn
http://BRKG95vE.hffjj.cn
http://dBDIPYwm.hffjj.cn
http://SLIIbOMC.hffjj.cn
http://h75PWqA9.hffjj.cn
http://9EQCOZeE.hffjj.cn
http://piejbX5B.hffjj.cn
http://27Xnad6O.hffjj.cn
http://XUIPGhmL.hffjj.cn
http://w36Wq948.hffjj.cn
http://CIJnPVWu.hffjj.cn
http://JuPzuu6u.hffjj.cn
http://8mKXRsVb.hffjj.cn
http://muabTnkR.hffjj.cn
http://7ykyXmOb.hffjj.cn
http://TRXNbNUV.hffjj.cn
http://ZiHrvsmA.hffjj.cn
http://KSFv8jCu.hffjj.cn
http://ZHJJugtk.hffjj.cn
http://T1rm1mM0.hffjj.cn
http://clGN2Zjo.hffjj.cn
http://NxLjn3jw.hffjj.cn
http://wg9jtxH4.hffjj.cn
http://xjSI6Agj.hffjj.cn
http://zlyUkA5a.hffjj.cn
http://Urjs4gjw.hffjj.cn
http://qrg3wnWx.hffjj.cn
http://B7OEmnbT.hffjj.cn
http://IK4IpYiq.hffjj.cn
http://www.dtcms.com/a/387567.html

相关文章:

  • Start application catch exception
  • 机器视觉在半导体封装检测中的应用
  • 雅菲奥朗SRE知识墙分享(九):『变更管理的定义与实践』
  • 51c视觉~3D~合集6
  • webRTC 的协议族
  • 线激光相机 眼在手上六轴机器人手眼标定 备忘记录
  • QML学习笔记(一)基本了解和工程配置
  • 大数据毕业设计选题推荐-基于大数据的牛油果数据可视化分析系统-Hadoop-Spark-数据可视化-BigData
  • Hadoop单机模式下运行grep实例,output文件目录不存在
  • 【docker】清理中断构建后产生的镜像和缓存
  • Vue2项目集成打包分析工具webpack-bundle-analyzer
  • 【阶梯波发生器如何控制电压和周期】2022-12-9
  • Java 设计模式之桥接模式(Bridge Pattern)
  • Android 端启动 HTTP 服务:从基础实现到实战应用
  • 《2D横版平台跳跃游戏中角色二段跳失效与碰撞体穿透的耦合性Bug解析》
  • 基于本机知识库 + 豆包(火山引擎)+ MCP的落地方案
  • OpenCV 风格迁移、DNN模块 案例解析及实现
  • php实现火山引擎 【双向流式websocket-V3-支持复刻2.0/混音mix】开箱即用,可用于各种PHP框架。
  • 【lua】Windows环境下cffi-lua使用指南:编译、安装与测试
  • 我优化了昨天的C++/Lua插件系统:添加了插件沙箱、Lua 状态池
  • 【数据库】SQLite安装部署与使用指南
  • Android Kotlin 请求方法代码
  • 【easy_tools】一个跨平台裸机工具库,包含任务/堆栈/消息/定时器/日志等实现
  • ARM(11) - LM75
  • FPGA实现SRIO数据回环传输,基于Serial Rapidlo Gen2架构,提供6套工程源码和技术支持
  • 第十九章 Arm C1-Premium TRBE技术解析
  • HTB writeup
  • 科学研究系统性思维的理论基础:数字化研究工具
  • 基于有限元-元胞自动机法(CAFE)的增材制造过程组织模拟
  • 电视行业复兴,数字化制造如何重塑“视界”新格局?