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

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

相关文章:

  • 【外研在线-注册/登录安全分析报告】
  • leetcode 1143. Longest Common Subsequence
  • 基于springboot的商城
  • 智能体团队 (Agent Team)
  • MVCC介绍
  • NEAT 算法解决 Lunar Lander 问题:从理论到实践
  • 计算机组成原理知识点汇总(四)输入输出系统
  • 计算机是如何看待数据的?
  • 【C++详解】C++入门(一)命名空间、缺省参数、函数重载
  • dubbo SPI插件扩展点使用
  • Python变量全解析:从基础到高级的命名规则与数据类型指南
  • 一招破敌,掌控 React 渲染术:createRoot 与 root.render
  • 信创时代编程开发语言选择指南:国产替代背景下的技术路径与实践建议
  • Java学习手册:Filter 和 Listener
  • SSM--AOP 日志
  • 2025/4/20 实验作业 linux系统权限相关实验
  • 股票分析技术指标【MACD】
  • 集合框架(重点)
  • ThreadLocal - 原理与应用场景详解
  • 解决IDEA创建SpringBoot项目没有Java版本8
  • 中方决定对在涉港问题上表现恶劣的美国国会议员、官员和非政府组织负责人实施制裁
  • 一年一CT,十年进ICU?关于CT检查致癌的真相
  • 新科世界冠军!雨果4比1战胜林诗栋,首夺世界杯男单冠军
  • 运油-20亮相中埃空军联训
  • 从高铁到住房:“富足议程”能否拯救美国的进步主义?
  • 2025“上海之夏”向全球邀约,首批城市定制活动集中亮相