当前位置: 首页 > article >正文

算法基础之KMP算法

KMP算法

  • 核心思想: 回退处理 和 next前缀数组

    • ne[N]前缀数组表示 模式串当前位置的最长相当前后缀

    • 当一个字符不匹配时 可以回退到上一个前后缀相等的位置 再次开始匹配 不用再遍历一次

    •   #include <iostream>
        using namespace std;
        const int N = 100010, M = 1000010;
        
        int n, m;
        int ne[N];
        char s[M], p[N];  //注意是char
        
        int main(){
            //从1开始 回退时直接回退到ne[j];
            cin >> n >> p + 1 >> m >> s + 1;
        
            //i从2开始 因为ne[1]一定为0
            for (int i = 2, j = 0; i <= n; i ++ )
            {
                while (j && p[i] != p[j + 1]) j = ne[j]; //不匹配时回退
                if (p[i] == p[j + 1]) j ++ ;  //匹配时j++
                ne[i] = j;  //记录当前追偿相等前后缀大小
            }
        
            for (int i = 1, j = 0; i <= m; i ++ )
            {
                while (j && s[i] != p[j + 1]) j = ne[j];  //不匹配
                if (s[i] == p[j + 1]) j ++ ;  //匹配
                if (j == n)  //找到子串
                {
                    cout<<i-n<<" ";
                    j = ne[j];  //可能出现两个子串重叠的情况
                }
            }
            return 0;
        }
      

http://www.kler.cn/news/149892.html

相关文章:

  • PHP连接数据库 错误抑制 三元运算符 学习资料
  • 解决PDF预览时,电子签章、日期等不显示问题
  • 基于springboot实现农机电招平台系统项目【项目源码+论文说明】计算机毕业设计
  • einj 注入内存ue/ce故障
  • 人工智能_机器学习055_拉格朗日乘子法_拉格朗日乘数法的原理介绍_流程详解---人工智能工作笔记0095
  • 团购生鲜系统丨分销丨外卖丨跑腿丨app小程序H5,源码交付,支持二开!
  • 轻松整合Knife4j:快速搭建Swagger文档界面与接口调试
  • 面试题背诵,回答的思路和模板,思路清晰
  • 【论文笔记】SDCL: Self-Distillation Contrastive Learning for Chinese Spell Checking
  • 基于LangChain实现的知识库问答工具Langchain-Chatchat
  • 数据库的增删查改(CRUD)基础版
  • C++面试的一些总结day1:指针和引用的区别
  • Spring Boot 在进行依赖注入时,使用了反射机制,类加载器-启动类拓展类-应用类加载器
  • 第二十章Java博客
  • Java学习笔记45——类的加载和反射机制
  • Android 13 - Media框架(14)- OpenMax(三)
  • 新王加冕,GPT-4V 屠榜视觉问答
  • Python---练习:求某同学成绩的总分及平均分
  • 二分查找(折半查找)探究学习
  • 常见的 QML 类型
  • MySQL之JDBC编程
  • 阿里巴巴矢量图标库的使用
  • calendar --- 日历相关函数
  • C++中的前缀和
  • Unity一些常用的接口
  • ubuntu 22.04版本修改时区的操作方法
  • 解密 sqli靶场第一关:一步一步学习 SQL 注入技术
  • 插入区间[中等]
  • 自定义中间件
  • vue本地存储