C语言实现KMP算法

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

void getNextArray(char * sub_str, int sub_str_length, int * next_array);
int kmpSearch(char * sub_str, char * main_str);

int main(void) {

    // 1 声明用于算法处理的字符串
    char origin_str[] = "ababcababce";
    char sub_str[] = "ababce";

    //2 调用算法查找
    int index = kmpSearch(sub_str, origin_str);
    printf("找到了 下标为:%d ", index);
    return 0;
}

void getNextArray(char * sub_str, int sub_str_length, int * next_array) {
    next_array[0] = 0;
    int j = 0;
    for (int i = 1; i < sub_str_length; i++) {// 这里的i控制的是子串的遍历
        while (j > 0 && sub_str[j] != sub_str[i]) // 处理不相同的情况 因为不相同可能有连续多个
        {
            j = next_array[j - 1]; // 向前移动
        }

        if (sub_str[j] == sub_str[i]) // 相同
        {
            j++;
        }
        next_array[i] = j;
    }
    return;
}

int kmpSearch(char * sub_str, char * main_str) {
    // 1 计算next数组
    int sub_str_length = strlen(sub_str);
    int * next_array = (int *)malloc(sub_str_length * sizeof(int));
    getNextArray(sub_str, sub_str_length, next_array);
    // 输出 next 数组
    for(int i = 0; i < sub_str_length; i++) {
        printf("%d ", next_array[i]);
    }
    printf("\n");

    // 2 查找部分
    int main_str_length = strlen(main_str);
    int i = 0;
    int j = 0;

    while (i < main_str_length)
    {
        if (main_str[i] == sub_str[j])
        {
            i++;
            j++;
        } else {
            j = next_array[j];
        }
        
        if (j == sub_str_length)
        {
            free(next_array);
            return i - j; // 返回匹配到的起始索引
        }
        
    }
    
    // 释放内存
    free(next_array);
    return -1;
}

运行效果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/749332.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

量化交易策略:定义及其重要性

量化交易是华尔街和硅谷的秘密结合点&#xff0c;在这里数学和算法与金钱和市场相遇。虽然它曾经是金融巨头的专属领域&#xff0c;但现在它比以往任何时候都更易于接触。 但不要被愚弄&#xff0c;量化交易仍然是一种高速、高压的游戏&#xff0c;在毫秒间可以赚到或失去财富…

ManageEngine连续荣登Gartner 2024年安全信息和事件管理魔力象限

我们很高兴地宣布&#xff0c;ManageEngine再次在Gartner的安全信息和事件管理&#xff08;SIEM&#xff09;魔力象限中榜上有名&#xff0c;这是我们连续第七年获得这一认可。 Gartner ManageEngine Log360是一款全面的SIEM解决方案&#xff0c;旨在帮助组织有效处理日志数据…

Quads,一个无敌的 Python 库!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 大家好&#xff0c;今天为大家分享一个无敌的 Python 库 - Quads。 Github地址&#xff1a;https://github.com/fogleman/Quads 在科学计算和工程应用中&#xff0c;数值积分是一个常见的问题。Python的Quads库…

Java基础知识整理笔记

目录 1.关于Java概念 1.1 谈谈对Java的理解&#xff1f; 1.2 Java的基础数据类型&#xff1f; 1.3 关于面向对象的设计理解 1.3.1 面向对象的特性有哪些&#xff1f; 1.3.2 重写和重载的区别&#xff1f; 1.3.3 面向对象的设计原则是什么&#xff1f; 1.4 关于变量与方…

vite 创建vue3项目 集成 ESLint、Prettier、Sass等

在网上找了一大堆vue3脚手架的东西&#xff0c;无非就是vite或者vue-cli,在vue2时代&#xff0c;vue-cli用的人挺多的&#xff0c;也很好用&#xff0c;然而vue3大多是和vite搭配搭建的&#xff0c;而且个人感觉vite这个脚手架并没有那么的好用&#xff0c;搭建项目时只能做两个…

McgsPro初级使用教程

MCGS触摸屏 1.也被称为昆仑通态触摸屏&#xff0c;是一款在工业自动化领域广泛应用的触摸屏产品。 2.以其高度可靠、多点触控、防水防尘、宽温设计、强大的通信能力、多样化的显示内容、灵活的组态设计和丰富的脚本编程等特点&#xff0c;成为工业自动化领域的强大伙伴。 下载好…

科技创新前沿:Web3在全球发展中的角色

随着数字技术的快速发展&#xff0c;Web3作为新一代互联网技术正逐渐引领着全球科技创新的潮流。本文将深入探讨Web3技术的定义、特点&#xff0c;以及它在全球范围内的应用和未来发展的前景。 1. 引言&#xff1a;Web3技术的定义与演进 Web3是指建立在区块链技术和加密经济学…

还在花钱做数据可视化?为大家推荐一款免费可视化工具

在当今数据驱动的世界里&#xff0c;数据可视化已经成为不可或缺的工具&#xff0c;帮助我们更好地理解和分析信息。然而&#xff0c;许多企业和个人仍在为昂贵的可视化软件买单&#xff0c;承受着高昂的费用和复杂的操作流程。因此&#xff0c;作为一个经常接触数据可视化的相…

常微分方程算法之编程示例六-解一阶方程组(龙格-库塔法)

目录 一、研究问题 二、C++代码 三、计算结果 一、研究问题 本节我们采用龙格-库塔法(Runge-Kutta法)求解一阶方程组初值问题。 之前我们已经利用龙格-库塔法求解常微分方程问题,详见: 常微分方程算法之编程示例四(龙格-库塔法)-CSDN博客https://blog.csdn.net/L_pea…

MTK平台Android13实现三方launcher为默认

一、前言 目前有遇到客户的定制需求,希望使用三方的launcher作为默认的launcher使用,一般情况下直接将三方launcher通过内置到系统并通过overlay机制即可很方便的实现launcher的替换,但是存在一个问题,需要增加ROM的维护成本。本文通过设备在使用前联网通过后台下发三方lau…

CPU的功能和基本结构

目录 一. 运算器的基本结构1.1. 专用数据通路方式1.2 CPU内部单总线方式 \quad 每执行完一条指令之后, CPU都会检查一下是否有中断处理(比如鼠标的点击操作,或出现的异常情况) \quad 一. 运算器的基本结构 \quad 1.1. 专用数据通路方式 \quad 对于X86架构的CPU来说, 通用寄存器…

vs code python开发笔记

目录 安装插件 不全&#xff1a; 2.选择python解释器 安装插件 不全&#xff1a; remote ssh python debuger 左下角&#xff0c;点击左右左右箭头&#xff0c;远程连接到ssh 2.选择python解释器 ctrlshiftP打开VSCode的命令行&#xff0c;输入python: select Interpreter…

数据分析:置换检验Permutation Test

欢迎大家关注全网生信学习者系列&#xff1a; WX公zhong号&#xff1a;生信学习者Xiao hong书&#xff1a;生信学习者知hu&#xff1a;生信学习者CDSN&#xff1a;生信学习者2 介绍 置换检验是一种非参数统计方法&#xff0c;它不依赖于数据的分布形态&#xff0c;因此特别适…

上班族真的有必要买智能猫砂盆吗?解放双手刻不容缓!

养猫家庭真是出不了一点远门&#xff0c;但凡外出的时间久了&#xff0c;家里的猫屎就堆积成山&#xff0c;不及时铲掉的话&#xff0c;回来一进门就能在猫砂盆中挖出满满当当的“宝藏”&#xff0c;仔细一闻还能闻到空气中散发的阵阵“清香”。忍无可忍的我最后借助科技的力量…

探索强化学习(人工智能重要子领域):原理、算法及应用

引言 人工智能&#xff08;Artificial Intelligence, AI&#xff09;作为一个广泛的领域&#xff0c;旨在使机器具备模仿或超越人类智能的能力。机器学习&#xff08;Machine Learning, ML&#xff09;是实现这一目标的重要手段&#xff0c;通过数据驱动的方法&#xff0c;使机…

Android笔记-adb keycode大全

使用方法 用adb发送按键事件时&#xff0c;可以使用下面表中的枚举值或者直接使用数值&#xff0c;比如 adb shell input keyevent KEYCODE_HOME 或者 adb shell input keyevent 3 下面按三种排序方法列出所有按键的 keycode&#xff0c; 分别是&#xff1a; 按功能分 按枚…

keil仿真,查看函数执行时间和执行次数

Execution Profiler执行档案器 The Execution Profiler records timing and execution statistics about instructions for the complete program code. To view the values in the Editor or Disassembly Window, use Show Time or Show Calls from the menu Debug — Executi…

Maven高级的聚合和继承

聚合和继承 我们的项目已经从以前的单模块&#xff0c;变成了现在的多模块开发。项目一旦变成了多模块开发以后&#xff0c;就会引发一些问题&#xff0c;在这一节中我们主要会学习两个内容聚合和继承&#xff0c;用这两个知识来解决下分模块后的一些问题。 3.1 聚合 分模块开…

风控图算法之社群发现算法(小数据集Python版)

风控图算法之社群发现算法&#xff08;小数据集Python版&#xff09; 在风险控制领域&#xff0c;图算法扮演着日益重要的角色。&#xff08;这方面的资料有很多&#xff0c;不再赘述&#xff09; 图算法在风控场景的应用 图分析方法在业务风控中的应用 特别是社群发现算法&a…

软件测试必看!5分钟掌握sql查询的聚合函数

数据查询操作之排序 语法格式&#xff1a; select * from 表名 order by 字段名 asc| desc 重点&#xff1a; 1 字段名可以有多个&#xff0c;如果字段名1 相同&#xff0c;再按照字段名2排序 2 默认情况下按照从小到大去排列 3 asc 就是从小到大排列 desc 从大到小排列 …