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

C语言KMP算法实现

#include <stdio.h>
#include <string.h>

#define ok 1
#define error 0

typedef struct
{
char arr[101];
int length;
} string;

// 写一个初始化字符窜的函数
int stringinit(string &s)
{
printf(“please input the string:”);
// 易错:由于是从下标为一的位置开始存储,所以这里录入的时候也应该从下标为一的位置开始录入
scanf(“%s”, s.arr + 1);
// 易错:同理是一样的问题,从下标为1的位置开始往后统计字符
s.length = strlen(s.arr + 1);
printf(“the string’s length which you have input is : %d\n”, s.length);
printf(“\n”);
printf(“input success\n”);
printf(“\n”);
return ok;
}

void getnextval(string b, int nextval[])
{
// 这里的 i(后缀指针) j(前缀指针) 都是针对模式串,i可以理解是移动的指针,书上的是从1开始计数
int i = 1;
nextval[1] = 0;
int j = 0;
while (i < b.length) // 易错:这里不取等,确保 i++ 之后 i<b.length
{
if (j == 0 || b.arr[i] == b.arr[j])
{
i++;
j++;
if (b.arr[i] != b.arr[j])
{
nextval[i] = j;
}
else
{
nextval[i] = nextval[j];
}
}
else
{
j = nextval[j];
}
}
}

int KMP(string a, string b, int position)
{
int i = position;
int j = 1;
// 易错:这里需要初始化nextval数组,计算nextval数组的值
int nextval[101];
getnextval(b, nextval);
while (i <= a.length && j <= b.length)
{
if (j == 0 || a.arr[i] == b.arr[j])
{
i++;
j++;
}
else
{
j = nextval[j];
}
}
if (j > b.length)
{
printf(“match successful\n”);
printf(“The starting position of the match is :%d\n”, i - b.length);
return ok;
}
else
{
printf(“fail to match\n”);
return error;
}
}

int main()
{
int position = 1;
string a;
string b;
stringinit(a);
stringinit(b);
KMP(a, b, position);
}

http://www.xdnf.cn/news/659.html

相关文章:

  • max31865典型电路
  • OpenCV 在二值图像中查找轮廓 cv2.findContours
  • Linux 常用命令 -pkill【通过进程名或其他属性来发送信号给一个或多个进程】
  • Transfomer的本质
  • Go语言--语法基础4--基本数据类型--浮点数类型
  • AWS EC2完全指南:如何快速搭建高性能云服务器?
  • A2A协议详解:打造统一的AI代理通信标准,实现多Agent系统协同
  • TDengine 性能监控与调优实战指南(一)
  • SQL注入 02
  • 【Part 2安卓原生360°VR播放器开发实战】第一节|通过传感器实现VR的3DOF效果
  • SpringBoot编写单元测试
  • libdxfrw库使用总结
  • 开源的 PDF 文件翻译软件
  • 借助 OpenCV 和 PyTorch 库,利用卷积神经网络提取图像边缘特征
  • 【源码+文档+调试讲解】扶贫助农系统
  • VSCode PIO使用Jlink SWD烧录Stm32
  • 【C++】初始化列表
  • 信息系统项目管理工程师备考计算类真题讲解五
  • Redis ④-通用命令
  • 解决Docker 配置 daemon.json文件后无法生效
  • 【数据可视化-19】智能手机用户行为可视化分析
  • Windows 环境下安装 MariaDB 及 HeidiSQL 使用教程
  • 玩机搞机基本常识-------小米OLED屏幕机型怎么设置为永不休眠_手机不息屏_保持亮屏功能 拒绝“烧屏” ?
  • 【Vim】vim的简单使用
  • 小迪第10天http/s数据包
  • JavaScript 一维数组转二维数组
  • 修改PointLIO项目
  • STM32配置系统时钟
  • 【PyTorch】训练时跟OOM相关的提示信息
  • AI大模型之模型幻觉