数据结构--字符串的KMP算法

这篇具有很好参考价值的文章主要介绍了数据结构--字符串的KMP算法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

数据结构–字符串的KMP算法

数据结构--字符串的KMP算法,408数据结构,算法,数据结构,c语言,c++,KMP,字符串匹配算法

朴素模式匹配算法:
一旦发现当前这个子串中某个字符不匹配,就只能转而匹配下一个子串(从头开始)

数据结构--字符串的KMP算法,408数据结构,算法,数据结构,c语言,c++,KMP,字符串匹配算法

但我们可以知道:
不匹配的字符之前,一定是和模式串一致的 \color{red}不匹配的字符之前,一定是和模式串一致的 不匹配的字符之前,一定是和模式串一致的

我们可以利用这个信息进行优化查找,我们知道一定无法匹配的就无需再进行匹配操作了

数据结构--字符串的KMP算法,408数据结构,算法,数据结构,c语言,c++,KMP,字符串匹配算法

我们可以发现:

数据结构--字符串的KMP算法,408数据结构,算法,数据结构,c语言,c++,KMP,字符串匹配算法

对于模式串T = ‘abaabc’
第 6 个 \color{red}第6个 6元素匹配失败时,可令主串指针 i 不变 \color{red}i不变 i不变,模式串指针 j = 3 \color{red}j=3 j=3
第 5 个 \color{red}第5个 5元素匹配失败时,可令主串指针 i 不变 \color{red}i不变 i不变,模式串指针 j = 2 \color{red}j=2 j=2
第 4 个 \color{red}第4个 4元素匹配失败时,可令主串指针 i 不变 \color{red}i不变 i不变,模式串指针 j = 2 \color{red}j=2 j=2
第 3 个 \color{red}第3个 3元素匹配失败时,可令主串指针 i 不变 \color{red}i不变 i不变,模式串指针 j = 1 \color{red}j=1 j=1
第 2 个 \color{red}第2个 2元素匹配失败时,可令主串指针 i 不变 \color{red}i不变 i不变,模式串指针 j = 1 \color{red}j=1 j=1
第 1 个 \color{red}第1个 1元素匹配失败时,匹配下一个相邻子串,令 j = 0 , i + + , j + + \color{red}j=0, i++, j++ j=0,i++,j++

再来一个Eg:

数据结构--字符串的KMP算法,408数据结构,算法,数据结构,c语言,c++,KMP,字符串匹配算法
对于模式串T = 'abaabc' 当$\color{red}第6个$元素匹配失败时,可令主串指针$\color{red}i不变$,模式串指针$\color{red}j=3$ 当$\color{red}第5个$元素匹配失败时,可令主串指针$\color{red}i不变$,模式串指针$\color{red}j=2$ 当$\color{red}第4个$元素匹配失败时,可令主串指针$\color{red}i不变$,模式串指针$\color{red}j=2$ 当$\color{red}第3个$元素匹配失败时,可令主串指针$\color{red}i不变$,模式串指针$\color{red}j=1$ 当$\color{red}第2个$元素匹配失败时,可令主串指针$\color{red}i不变$,模式串指针$\color{red}j=1$ 当$\color{red}第1个$元素匹配失败时,匹配下一个相邻子串,令$\color{red}j=0, i++, j++$

代码实现

typedef struct
{
    char ch[15];
    int length;
}SString;

int Index_KMP(SString S, SString T, int next[])
{
    int i = 1, j = 1;
    while (i <= S.length && j <= T.length)
    {
        if (j == 0 || S.ch[i] == T.ch[j])
            i++, j++; //继续比较后继字符
        else
            j = next[j]; //模式串向右移动
    }
    if (j > T.length)
        return i - T.length;
    else
        return 0;
}
数据结构--字符串的KMP算法,408数据结构,算法,数据结构,c语言,c++,KMP,字符串匹配算法
数据结构--字符串的KMP算法,408数据结构,算法,数据结构,c语言,c++,KMP,字符串匹配算法

n e x t 数组只和短短的模式串有关,和长长的主串无关 \color{red}next数组只和短短的模式串有关,和长长的主串无关 next数组只和短短的模式串有关,和长长的主串无关

时间复杂度

KMP算法, 最坏时间复杂度 O ( m + n ) \color{red}最坏时间复杂度O(m+n) 最坏时间复杂度O(m+n)
其中,求next 数组时间复杂度O(m)
模式匹配过程最坏时间复杂度O(n)文章来源地址https://www.toymoban.com/news/detail-524375.html

到了这里,关于数据结构--字符串的KMP算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构与算法之字符串: Leetcode 557. 反转字符串中的单词 III (Typescript版)

    翻转字符串中的单词 III https://leetcode.cn/problems/reverse-words-in-a-string-iii/ 描述 给定一个字符串 s ,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。 示例 1: 示例 2: 提示: 1 = s.length = 5 * 1 0 4 10^4 1 0 4 s 包含可打印的 ASCII 字符。 s 不包含任何开头或

    2024年02月01日
    浏览(77)
  • 数据结构课设:基于字符串模式匹配算法的病毒感染检测问题

    1.掌握字符串的顺序存储表示方法。 2.掌握字符串模式匹配算法BF算法或KMP算法的实现。 问题描述 医学研究者最近发现了某些新病毒,通过对这些病毒的分析,得知它们的DNA序列都是环状的。现在研究者已收集了大量的病毒DNA和人的DNA数据,想快速检测出这些人是否感染了

    2023年04月27日
    浏览(50)
  • 【JavaScript数据结构与算法】字符串类(计算二进制子串)

    个人简介 👀 个人主页: 前端杂货铺 🙋‍♂️ 学习方向: 主攻前端方向,也会涉及到服务端(Node.js) 📃 个人状态: 在校大学生一枚,已拿多个前端 offer(秋招) 🚀 未来打算: 为中国的工业软件事业效力 n 年 🥇 推荐学习:🍍前端面试宝典 🍉Vue2 🍋Vue3 🍓Vue2/3项目

    2024年02月05日
    浏览(46)
  • 数据结构与算法之字符串: Leetcode 20. 有效的括号 (Typescript版)

    有效的括号 https://leetcode.cn/problems/valid-parentheses/ 描述 给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 每个右括号都有一个对应的相

    2024年02月01日
    浏览(53)
  • 数据结构与算法之字符串: Leetcode 696. 计数二进制子串 (Typescript版)

    计数二进制子串 https://leetcode.cn/problems/count-binary-substrings/ 描述 给定一个字符串 s,统计并返回具有相同数量 0 和 1 的非空(连续)子字符串的数量,并且这些子字符串中的所有 0 和所有 1 都是成组连续的。 重复出现(不同位置)的子串也要统计它们出现的次数。 示例 1: 示

    2024年02月01日
    浏览(59)
  • C#,字符串匹配(模式搜索)KMP算法的源代码与数据可视化

      D.E.Knuth   J.H.Morris KMP 算法(Knuth-Morris-Pratt 算法)是其中一个著名的、传统的字符串匹配算法,效率比较高。 KMP算法由 D.E.Knuth , J.H.Morris 和 V.R.Pratt 在 Brute-Force 算法的基础上提出的模式匹配的改进算法。因此人们称它为“克努特—莫里斯—普拉特算法”,简称KMP算法。K

    2024年01月25日
    浏览(55)
  • 【kmp算法】字符串匹配

    kmp算法解决的是字符串匹配的问题,具体来说假定我们要在主串s[ ] 中匹配模式串p[ ],找到匹配到的位置loc; 最自然的想法是暴力写法 (BF)枚举主串字符s[ i ] ,和模式串p[ j ]。一个一个匹配,如果匹配失败,i指针回退回起点,往前进一位,再次进行比较,知道匹配成功。

    2024年02月04日
    浏览(76)
  • 字符串匹配-KMP算法

    KMP算法,字符串匹配算法,给定一个主串S,和一个字串T,返回字串T与之S匹配的数组下标。 在学KMP算法之前,对于两个字符串,主串S,和字串T,我们根据暴力匹配,定义两个指针,i指向主串S的起始,j指向字串T的起始,依次比较,如果 主串i位置的值等于子串j位置的值,

    2024年02月14日
    浏览(55)
  • 字符串匹配算法:KMP

    Knuth–Morris–Pratt(KMP)是由三位数学家克努斯、莫里斯、普拉特同时发现,所有人们用三个人的名字来称呼这种算法,KMP是一种改进的字符串匹配算法,它的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。它的时间复杂度是 O(m+n) 字

    2024年02月06日
    浏览(62)
  • 字符串匹配算法(BF&&KMP)

    个人主页:平行线也会相交 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创 收录于专栏【数据结构初阶(C实现)】 在学习这个算法之前,我们先来看看什么时字符串匹配算法,简单来说 有一个主串和一个子串,查找子串在主串的位置,然后返回这个位置

    2023年04月17日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包