/**
* 看了 b站视频 BV1jb411V78H 对KMP有了一点理解,然后我写了这个代码
* 这个代码和视频里面的有一点不同,字符串是从 0 开始的,而不是从1 开始的
* 希望能够帮到学习KMP的人
*/ #include <stdbool.h>
#include <malloc.h>
#include "KMP.h" // KMP.h 内容
/*
#define MAXSIZE (255) typedef struct {
char ch[MAXSIZE + 1];
int length;
}SString; void Next(SString const *t);
extern int *next;
int IndexOf_KMP(SString const *s, SString const *t);
*/ int *next; // 计算 next数组 /**
* 计算 0-based 模式串t的next数组
* @param t 模式串
*/
void Next(SString const *t) {
// 模式串 0 开始
int length = t->length; // 分配 next数组 所需要的空间
next = (int *)malloc(sizeof(int) * length);
for (int *p = next; p < next + length; p++)
{
*p = 0;
} for (int i = 0; i < length; i++)
{
if (i <= 1) // 前两个next[i]置为-1
{
next[i] = -1;
continue;
} // 执行下面的语句的时候, 一定有 i >= 2 int maxlen = 0; // 存储最长公共前后缀的长度 /**
* // len 表示前缀或后缀的最大长度, 可取的值是 [1..i-1] // i 为(模式串或next数组)的访问下标
* 这里主要是 对 模式串在i位置 求 它的最大公共前后缀的长度
* 从 1 开始 到 i-1 一个一个去试
*
*/
for (int len = 1; len < i; len++)
{
int val = 0;
bool flag = false; for (int j = 0, k = i - len; j < len; j++, k++)
{
if (t->ch[j] == t->ch[k])
{
}
else
{
flag = true; // len 长度的公共前后缀匹配失败
break;
}
} if (flag == false) // 公共前后缀长度为len
val = len;
if (val > maxlen) // 这个比较不是必须的,因为找公共前后缀的长度的时候, len 从 1 到 i-1
maxlen = val; // maxlen 就是 next[i]的值了
}
next[i] = maxlen;
}
} // 调用这个函数之前,一定要调用 Next函数,为模式串构建 next数组
int IndexOf_KMP(SString const *s, SString const *t)
{
// 开始匹配 int i = 0, j = 0; // i 表示主串的下标, j 表示模式串的下标
while (i < s->length)
{
if (j == -1 || s->ch[i] == t->ch[j])
{
i++;
j++;
}
else
{
j = next[j];
} // 匹配成功
if (j == t->length)
{
return i - t->length;
}
} // 匹配失败
return -1;
}

模式串 从 0 开始的KMP算法的更多相关文章

  1. 串匹配模式中的BF算法和KMP算法

    考研的专业课以及找工作的笔试题,对于串匹配模式都会有一定的考察,写这篇博客的目的在于进行知识的回顾与复习,方便遇见类似的题目不会纠结太多. 传统的BF算法 传统算法讲的是串与串依次一对一的比较,举例设 ...

  2. 数据结构(十六)模式匹配算法--Brute Force算法和KMP算法

    一.模式匹配 串的查找定位操作(也称为串的模式匹配操作)指的是在当前串(主串)中寻找子串(模式串)的过程.若在主串中找到了一个和模式串相同的子串,则查找成功:若在主串中找不到与模式串相同的子串,则查找 ...

  3. 字符串与模式匹配算法(三):KMP算法

    一.KMP算法介绍 KMP算法与前面的MP算法一脉相承,都是充分利用先前匹配的过程中已经得到的结果来避免频繁回溯.回顾一下MP算法,如下图的模式串偏移,当前模式字符串P的左端的p0与目标字符串T中tj ...

  4. 字符串模式匹配之KMP算法的next数组详解与C++实现

    相信来看next数组如何求解的童鞋已经对KMP算法是怎么回事有了一定的了解,这里就不再赘述,附上一个链接吧:https://www.cnblogs.com/c-cloud/p/3224788.html ...

  5. (原创)白话KMP算法(续)

    第二章:KMP改良算法 第一章里面我们讲完了KMP算法的next数组实现法,回忆一下其实最重要的内容无非就是一.理解 i 指针无用回溯的意义,二.理解 j 指针的定位和模式串中每个元素重复度的关系,三 ...

  6. Java数据结构之字符串模式匹配算法---KMP算法2

    直接接上篇上代码: //KMP算法 public class KMP { // 获取next数组的方法,根据给定的字符串求 public static int[] getNext(String sub ...

  7. 串的匹配:朴素匹配&amp;KMP算法

    引言 字符串的模式匹配是一种经常使用的操作. 模式匹配(pattern matching),简单讲就是在文本(text,或者说母串str)中寻找一给定的模式(pattern).通常文本都非常大.而模式 ...

  8. KMP算法-Java实现

    目的: 为了解决字符串模式匹配 历程: 朴素模式匹配:逐次进行比较 KMP算法:利用匹配失败得到的信息,来最大限度的移动模式串,以此来减少比较次数提高性能 概念: m:是目标串长度 n:是模式串长度 ...

  9. 【模式匹配】KMP算法的来龙去脉

    1. 引言 字符串匹配是极为常见的一种模式匹配.简单地说,就是判断主串\(T\)中是否出现该模式串\(P\),即\(P\)为\(T\)的子串.特别地,定义主串为\(T[0 \dots n-1]\),模 ...

随机推荐

  1. 什么是谷歌PageRank (简称PR值)

    http://www.wocaoseo.com/thread-213-1-1.html 谷歌pageRank是谷歌用来评测网页质量高低的一个工具,主要分为0到10共11个等级,目前有很多的工具或谷歌工 ...

  2. 力扣Leetcode 面试题51. 数组中的逆序对 - 归并排序

    在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 示例 1: 输入: [7,5,6,4] 输出: 5 限制: 0 <= ...

  3. Python 中的数字到底是什么?

    花下猫语:在 Python 中,不同类型的数字可以直接做算术运算,并不需要作显式的类型转换.但是,它的"隐式类型转换"可能跟其它语言不同,因为 Python 中的数字是一种特殊的对 ...

  4. ctf常见源码泄露

    前言 在ctf中发现很多源码泄露的题,总结一下,对于网站的搭建要注意删除备份文件,和一些工具的使用如git,svn等等的规范使用,避免备份文件出现在公网 SVN源码泄露 原理 SVN(subversi ...

  5. 部署一套完整的Kubernetes高可用集群(二进制,最新版v1.18)下

    七.高可用架构(扩容多Master架构) Kubernetes作为容器集群系统,通过健康检查+重启策略实现了Pod故障自我修复能力,通过调度算法实现将Pod分布式部署,并保持预期副本数,根据Node失 ...

  6. Fastbin attack——Double Free

    ptmalloc ptmalloc的基本思路是将堆上的内存区域划分为多个chunk,在分配/回收内存时,对chunk进行分割.回收等操作.在32位系统下,chunk头的大小为8 Bytes,且每个ch ...

  7. leetcode题目,个人见解1

    给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一. 最高位数字存放在数组的首位, 数组中每个元素只存储单个数字. 你可以假设除了整数 0 之外,这个整数不会以零开头. 示例 1: 输入 ...

  8. Java Web项目实现写日志功能

    第一步:导入log4j-1.2.16的jar包 第二步:在servlet包里编写写日志的servlet,代码如下: public class InitServlet extends HttpServl ...

  9. 初识ABP vNext(9):ABP模块化开发-文件管理

    Tips:本篇已加入系列文章阅读目录,可点击查看更多相关文章. 目录 前言 开始 创建模块 模块开发 应用服务 运行模块 单元测试 模块使用 最后 前言 在之前的章节中介绍过ABP扩展实体,当时在用户 ...

  10. C#托管堆和非托管堆