C语言实现字符串匹配KMP算法

C语言实现字符串匹配KMP算法

什么是KMP算法

字符串匹配是计算机科学中的一个基本问题,给定两个文本串A和B,其中A称为主串,B称为模式串,现在要查找B在A中第一次出现的位置,这就是字符串匹配的问题。

KMP算法(Knuth-Morris-Pratt算法)是一种字符串匹配算法,它利用了字符串的局部匹配特性来提升匹配效率。与暴力匹配算法相比,KMP算法的时间复杂度为O(n+m),其中n是主串的长度,m是模式串的长度,相比之下,暴力匹配算法的时间复杂度为O(n*m)。

KMP算法的实现过程

KMP算法实现的核心是构造模式串的next数组,next数组中存储的是模式串中所有前缀子串中最长的相等前缀后缀的长度。

具体实现过程如下:

  1. 构造next数组

首先需要预处理模式串的next数组,如果next[i] = j,则表示模式串的前i个字符中,最长的相等前缀后缀的长度为j。

构造next数组的过程分为三步:

(1)初始化next数组为0

(2)通过遍历模式串生成next数组,找到当前位置前面最长相等前后缀的长度

(3)当找到当前位置的最长相等前后缀时,更新next数组

  1. 匹配主串和模式串

利用已经构造好的next数组,进行主串和模式串的匹配

如果模式串和主串的字符匹配成功,模式串和主串的索引值都加1;如果匹配不成功,则主串的索引值不变,模式串的索引值变为next[j]。

最后如果匹配成功,返回主串中匹配的起始位置,如果匹配失败,返回-1。

KMP算法的C语言实现

以下是KMP算法在C语言中的实现,包含匹配函数和构造next数组的函数:

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

void getNext(char *pattern, int *next) {
    int i = 0, j = -1;
    next[0] = -1;
    while (i < strlen(pattern)) {
        if (j == -1 || pattern[i] == pattern[j]) {
            i++;
            j++;
            next[i] = j;
        } else {
            j = next[j];
        }
    }
}

int kmp(char *text, char *pattern) {
    int i = 0, j = 0;
    int next[strlen(pattern)];
    getNext(pattern, next);
    while (i < strlen(text) && j < strlen(pattern)) {
        if (j == -1 || text[i] == pattern[j]) {
            i++;
            j++;
        } else {
            j = next[j];
        }
    }
    if (j == strlen(pattern)) {
        return i - j;
    } else {
        return -1;
    }
}

示例

以下是对上述KMP算法的两条示例说明。

示例1

假设我们要在文本串中查找模式串ABCDABD,文本串为ABCDEFGABCDABCEFG,上述kmp函数的调用过程如下:

kmp("ABCDEFGABCDABCEFG", "ABCDABD");

得到的结果是:

7

表示模式串ABCDABD在文本串中从第7个位置开始出现。

示例2

假设我们要在文本串中查找模式串hello,文本串为hello world,上述kmp函数的调用过程如下:

kmp("hello world", "hello");

得到的结果是:

0

表示模式串hello在文本串中从第0个位置开始出现。

总结

KMP算法是一种高效的字符串匹配算法,在实现过程中需要理解next数组的概念和构造方法,代码实现过程相对较简单,但需要考虑到细节问题,如边界处理,数组下标从0开始等。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言实现字符串匹配KMP算法 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • C连接Mysql数据库代码

    当我们需要在C程序中使用MySQL数据库时,我们需要连接MySQL数据库。下面是将C程序连接MySQL数据库的完整攻略。 步骤1:安装MySQL C API 在C程序中使用MySQL数据库,我们需要安装MySQL C API。MySQL提供了C API开发包,我们可以到MySQL官方网站上下载。 步骤2:连接MySQL数据库 连接MySQL数据库前,需要先初…

    C 2023年5月23日
    00
  • 荣耀畅玩8C手机做工如何?荣耀畅玩8C手机拆机全过程评测

    荣耀畅玩8C手机做工评测 1. 外观设计 荣耀畅玩8C手机的外观设计非常简洁,采用了流行的刘海屏设计。机身采用金属材质,整体质感比较好。机身厚度较薄,手感舒适。机身背面还配有指纹识别器,方便快捷。 2. 屏幕 荣耀畅玩8C手机采用了6.26英寸的高清显示屏,分辨率达到了720 x 1520像素。屏幕质量很不错,色彩鲜艳度和亮度都很高。观看视频、浏览图片时非常…

    C 2023年5月23日
    00
  • c++ 中__declspec 的用法详解

    下面是对 __declspec 在 C++ 中的详细讲解: 1. __declspec 的定义 __declspec 是 MicroSoft 编译器用来扩展代码基本属性的关键字,用于声明一个特殊的属性。通过使用 __declspec,开发者可以控制导出和从 DLL 中导入函数或数据,以及控制函数的调用约定、内联性、对齐性等属性。 2. __declspec …

    C 2023年5月23日
    00
  • 如何利用C语言实现最简单的HTTP服务器详解

    标题:如何利用C语言实现最简单的HTTP服务器详解 介绍 本教程将向你展示如何使用C语言来实现一个最简单的HTTP服务器。HTTP(超文本传输协议)是用于在Web上传输数据的基本协议。实现HTTP服务器的基本思想是接受来自客户端(Web浏览器、爬虫等)的HTTP请求,解析出请求的内容,然后向客户端返回HTTP响应(HTML页面、图片等)。本教程假设您已经了解…

    C 2023年5月22日
    00
  • 浅谈C语言的字节对齐 #pragma pack(n)2

    浅谈C语言的字节对齐 在C语言中,结构体是将不同类型的数据存储在一起的一种基本数据类型。在结构体中,结构体成员所占用的内存空间是按照类型大小和字节对齐规则来确定的。字节对齐是计算机领域中的一个重要话题,本文将深入浅出地讲解C语言的字节对齐。 定义 字节对齐指的是将数据存储在内存中时,按照一定的规则将数据的起始位置往后挪动若干字节,使得成员变量对齐到特定的地址…

    C 2023年5月23日
    00
  • C语言实现简单的三子棋项目

    C语言实现简单的三子棋项目攻略 项目简介 三子棋,是一种类似于国际象棋的传统棋类,规则简单易懂,适合初学者入门。C语言实现简单的三子棋项目是一个帮助初学者练习C语言编程的练手项目,也是学习算法思想和逻辑思维的好题目。 项目实现思路 整个项目的实现思路分为以下几个步骤: 显示游戏界面,初始化棋盘。 获取玩家输入的坐标,并对输入进行校验。 判断胜负及平局情况,输…

    C 2023年5月23日
    00
  • C++实现蓝桥杯竞赛题目—搭积木

    C++实现蓝桥杯竞赛题目—搭积木的完整攻略 题目描述 假设你们班有很多童鞋正在参加蓝桥杯竞赛,老师突然想了个好玩的游戏:大家一起来玩搭积木,规则如下:每个学生手里都有 $n$ 个积木,编写程序按照如下规则输出: 第一行输出所有积木的高度和; 第二行将所有积木按高度升序输出; 第三行将所有积木按高度降序输出; 第四行随机输出所有积木。 程序实现 首先,因为…

    C 2023年5月23日
    00
  • 通过VS中的数据源选择对话框简单实现数据库连接配置

    通过VS中的数据源选择对话框,可以简单地实现数据库连接配置。下面将分为以下几个步骤来介绍如何实现: 1. 打开Server Explorer 在Visual Studio的视图菜单中选择“Server Explorer”或者使用快捷键“Ctrl+\,Ctrl+S”来打开Server Explorer。 2. 添加数据源 在Server Explorer中右键…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部