7-17 KMP模式匹配算法

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

给定主串s和模式串p,编写程序使用KMP算法进行模式匹配,计算p在s中出现的首位置,若p不在s中则输出−1。字符串下标从0开始。

输入格式:

输入为2行,第1行为主串s,第2行为模式串p。主串和模式串长度不超过105。

输出格式:

输出为2行,第1行为3个整数,表示分别在模式串p的pm/4​,p2m/4​,p3m/4​处失配后,模式串下一次匹配的位置(即next[j]或f[j−1]+1的值,j=m/4,2m/4,3m/4),每个整数后一个空格,m表示模式串p的长度;第2行为一个整数,表示p在s中出现的首位置,若p不在s中则输出−1。文章来源地址https://www.toymoban.com/news/detail-856443.html

输入样例:

qwerababcabcabcabcdaabcabhlk
abcabcabcabc

输出样例:

0 3 6 
6

参考代码

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

// 定义最大字符串长度
#define MAX_LEN 100000

// 计算模式串的next数组
void get_next(char *p, int *next, int m) {
    next[0] = -1; // 初始化next[0]为-1
    int i = 0; // 定义i指向当前字符
    int j = -1; // 定义j指向前缀的最后一个字符
    while (i < m - 1) { // 循环遍历模式串
        if (j == -1 || p[i] == p[j]) { // 如果j为-1或者当前字符与前缀的最后一个字符相等
            i++; // i向后移动一位
            j++; // j向后移动一位
            next[i] = j; // 设置next[i]为j
        } else { // 否则
            j = next[j]; // j回溯到next[j]的位置
        }
    }
}

// 使用KMP算法进行模式匹配,返回首次匹配的位置,若无匹配则返回-1
int kmp(char *s, char *p, int *next, int n, int m) {
    int i = 0; // 定义i指向主串的当前字符
    int j = 0; // 定义j指向模式串的当前字符
    while (i < n && j < m) { // 循环遍历主串和模式串
        if (j == -1 || s[i] == p[j]) { // 如果j为-1或者当前字符相等
            i++; // i向后移动一位
            j++; // j向后移动一位
        } else { // 否则
            j = next[j]; // j回溯到next[j]的位置
        }
    }
    if (j == m) { // 如果j达到模式串的末尾
        return i - j; // 返回匹配的首位置
    } else { // 否则
        return -1; // 返回-1表示无匹配
    }
}

int main() {
    char s[MAX_LEN + 1]; // 定义主串s
    char p[MAX_LEN + 1]; // 定义模式串p
    int next[MAX_LEN + 1]; // 定义next数组
    scanf("%s", s); // 输入主串s
    scanf("%s", p); // 输入模式串p
    int n = strlen(s); // 获取主串长度
    int m = strlen(p); // 获取模式串长度
    get_next(p, next, m); // 计算模式串的next数组
    // 输出next数组中的三个值
    printf("%d %d %d \n", next[m / 4], next[m / 2], next[m * 3 / 4]);
    // 输出模式匹配的结果
    printf("%d", kmp(s, p, next, n, m));
    return 0; // 结束程序
}

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

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

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

相关文章

  • 【数据结构】字符串匹配|BF算法|KMP算法|next数组的优化

    字符串匹配算法是在实际工程中经常遇到的问题,也是各大公司笔试面试的常考题目,本文主要介绍BF算法(最好想到的算法,也最好实现)和KMP算法(最经典的) BF算法,即暴力(Brute Force)算法,是普通的模式匹配算法,BF算法的思想就是将目标S的第一个字符与模式串T的第一

    2024年02月04日
    浏览(57)
  • (C语言)数据结构算法-病毒感染检测(BF算法&&KMP算法)

    病毒感染检测: 医学研究者最近发现了某些新病毒,得知它们的DNA序列都是环状的。为了快速检测出患者是否感染了相应的病毒,研究者将患者的DNA和病毒的DNA均表示成一些字母组成的字符串序列,然后检测某种病毒DNA序列是否在患者的DNA序列中出现过,如果出现过,则此人

    2024年02月08日
    浏览(49)
  • C语言 数据结构--栈 括号匹配算法

    今天这一期使用栈来完成括号匹配算法 ① 栈结构 ② 初始化栈 ③ 入栈 ④ 出栈 ⑤ 判断栈是否为空 ⑤ 括号匹配 完整代码: 结果: (1)括号序列为char str[]={\\\'(\\\',\\\'{\\\',\\\'[\\\',\\\']\\\',\\\'}\\\',\\\')\\\'}; (2)括号序列为char str1[]={\\\'{\\\',\\\'(\\\',\\\'}\\\',\\\']\\\'};    

    2024年02月05日
    浏览(54)
  • 【数据结构】数组和字符串(十四):字符串匹配1:朴素的模式匹配算法(StringMatching)

      字符串(String)是由零个或多个字符(char)顺序排列组成的有限序列,简称为串。例如 “good morning”就是由12个字符构成的一个字符串。一般把字符串记作: S = ′ ′ a 0 a 1 … a n − 1 ′ ′ S=\\\'\\\'a_{0} a_{1}…a_{n-1}\\\'\\\' S = ′′ a 0 ​ a 1 ​ … a n − 1 ′′ ​   其中S是串名,引号中

    2024年02月05日
    浏览(74)
  • 数据结构—串的概述与算法【求子串、比较、删除、插入、扩容、模式匹配】

    💂 个人网站:  路遥叶子 🤟 版权: 本文由【路遥叶子】原创、在CSDN首发、需要转载请联系博主 💬 如果文章对你有帮助、 欢迎 关注、点赞、收藏 (一键三连)和订阅专栏哦 💅  想寻找共同成长的小伙伴,请点击【 Java全栈开发社区 】

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

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

    2023年04月27日
    浏览(50)
  • 【数据结构与算法】KMP算法

     在C语言的strstr的实现过程中,所涉及的算法较为简单,或者说只是一个简单的思路而已,在字符串过长时,所涉及的算法复杂度过大,那有没有比较简单的算法呢?这里就涉及到了KMP——由三位大佬提出的,下面我们一起来了解吧!  KMP算法是一种改进的字符串匹配算法

    2024年03月26日
    浏览(48)
  • 数据结构:KMP算法

         KMP算法是由Knuth、Morris和Pratt三位学者发明的,所以取了三位学者名字的首字母,叫作KMP算法。      KMP主要用于字符串匹配的问题,主要思想是 当出现字符串不匹配时,我们可以知道一部分之前已经匹配过的的文本内容,利用这些信息从而避免从头再开始匹配。    

    2024年02月04日
    浏览(48)
  • 数据结构--KMP算法

    模板: 例题:acwing--kmp字符串(831. KMP字符串 - AcWing题库) 给定一个字符串 S,以及一个模式串 P,所有字符串中只包含大小写英文字母以及阿拉伯数字。 模式串 P 在字符串 S 中多次作为子串出现。 求出模式串 P 在字符串 S 中所有出现的位置的起始下标。 输入格式 第一

    2024年02月11日
    浏览(42)
  • 数据结构KMP算法详解

    目录 1. KMP算法是什么? 2. KMP算法的由来 2.1 需要要解决的问题 2.2 一开始想到的方法 2.3 KMP算法诞生了 3.KMP算法的详解 4.KMP算法的实现 5.KMP算法的改进 KMP算法是一种改进的字符串匹配算法,即可以 快速的从主串中找到子串的算法 ,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人

    2024年02月12日
    浏览(59)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包