day35KMP算法

news2024/10/6 22:28:11

1.什么是KMP算法
解决字符串匹配问题;看文本串是否出现过模式串;
文本串:aabaabaaf;
模式串:aabaaf;
暴力解法:两层for循环,时间复杂度:O(m*n) m n分别是长度;
kmp解决:
在这里插入图片描述
f和b不匹配后(竖线),跳到模式串第一个b重新开始匹配;为啥跳b看下面

前缀表:b的前面是aa,后面也是aa,所以遇到不匹配的时候,就找前面最长前后缀;
aabaaf
前缀:包含首字母,不包含尾字母的所有子串;a aa aab aaba aabaa aabaaf;
后缀:包含尾字母,不包含首字母的所有子串;af aaf baaf abaaf
最长相等前后缀:a 0 aa 1 aab 0 aaba 1 aabaa 2 aabaaf 0
前缀表: 0 1 0 1 2 0 (上面数字) 2意味着有一个后缀aa ,前面有一个前缀aa。所以匹配从前缀的后面开始匹配,就是从b重新开始匹配;
next数组 或者prefix前缀表;
2.代码
next数组形式: 遇到冲突向前回退
左移一: -1 0 1 0 1 2;
整体减1 -1 0 -1 1 -1;

void getNext(int *next,char *s){
	//初始化i 后缀末尾 j前缀末尾,也代表i 包括i之前这个子串的最长相等前后缀的长度
	int j = 0;
	int next[0] = 0;
	int len = strlen(s);
	for(int i = 1; i < len; i++) {
		//前后缀不同
		while(s[i] != s[j] && j > 0) {
			j = next[j-1]; // j 回退
		}
	// 前后缀相同
	if(s[i] == s[j]){
	   j++;
	   // 更新next值
	  next[i] = j;
	  }
   }
 }

题目描述
在这里插入图片描述

//前缀表不减一版本
void getNext(int* next, char* s) {
    //初始化 next
    int j = 0;
    next[0] = j;
    for (int i = 1; i < strlen(s); i++) {	//注意 i 从 1 开始
        //若前后缀不相同
        while (j > 0 && s[i] != s[j]) {
            //则向前回退
            j = next[j - 1];
        }
        //若前后缀相同
        if (s[i] == s[j]) {
            //i 和 j 同时向后移动(i 的增加在 for 循环里)
            j++;
        }
        //将 j(前缀的长度)赋值给 next[i]
        next[i] = j;
    }
}

int strStr(char * haystack, char * needle){
    int len1 = strlen(haystack);
    int len2 = strlen(needle);
    //当 needle 为空字符串时,返回 0
    if (len2 == 0) {
        return 0;
    }

    //构建 next 数组
    int* next = malloc(sizeof(int) * len2);
    getNext(next, needle);
    //next 记录的起始位置为 0,所以这里也从 0 开始
    int j = 0;
    for (int i = 0; i < len1; i++) {	//注意匹配时 i 从 0 开始
        //若不匹配
        while (j > 0 && haystack[i] != needle[j]) {
            //j 退回到之前匹配的位置
            j = next[j - 1];
        }
        //若匹配
        if (haystack[i] == needle[j]) {
            //i 和 j 同时向后移动(i 的增加在 for 循环里)
            j++;
        }
        //当 j 等于 needle 的长度时,说明字符串 haystack 里出现了字符串 needle
        if (j == len2) {
            //返回 needle 字符串出现的第一个位置
            return (i - len2 + 1);
        }
    }
	
    //若未找到则说明不存在,返回 -1
    return -1;
}

题目描述
在这里插入图片描述

void CalcNext(char *p,int *next)
{
    next[0]=-1;
    int nlen = strlen(p);
    int k = -1;
    int j = 0;
    while (j < nlen) {
        if (k ==-1 || p[j] == p[k]) {
            ++k;
            ++j;
            next[j] = k;
        }
        else
        k = next[k];
    }
}
bool repeatedSubstringPattern(char * s){
    int length = strlen(s);
    int *next=(int *)malloc(sizeof(int)*(length+1));
    CalcNext(s,next);
    int k = next[length];
    int p = length-k;
    if(length%p == 0 && length != p)
    return true;
    return false;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/784072.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HTML中的焦点管理

前言 焦点作为页面交互中的重要一环&#xff0c;涉及到的知识点也比较多&#xff0c;有必要做一个统一的总结。 HTML 中的可获取焦点的元素 具有 href 属性的 HTMLAnchorElement/HTMLAreaElement非禁用态的 HTMLInputElement/HTMLSelectElement/HTMLTextAreaElement/HTMLBut…

C++实现简单内存池

/写一个简单的内存池class Cgirl { public:int bh;//编号int xw;//胸围static char* m_pool; //内存池的初始地址//内存池初始化函数、static bool initpool() {cout << "调用初始化函数\n\n";m_pool (char*)malloc(18);//向堆内存空间申请18字节if (m_pool …

100天精通Golang(基础入门篇)——第17天:深入解析Go语言中的指针

&#x1f337; 博主 libin9iOak带您 Go to Golang Language.✨ &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &#x1f30a; 《I…

F#奇妙游(17):F#与真空一维平面大地抛石飞行力学

F#还能干点啥 距离上一次更新已经过去了很久&#xff08;40分钟之久&#xff01;&#xff09;&#xff0c;这段时间我在学习F#&#xff0c;并且在工作&#xff08;划掉&#xff0c;躺肥并没有工作要做&#xff09;中使用F#。 那干点啥呢&#xff1f;还是老本行吧&#xff0c;…

ELK 使用kibana查询和分析nginx日志

背景&#xff1a;使用kibana查询和分析nginx请求日志&#xff0c;方便开发人员查询系统日志和分析系统问题。 setp 1、定义Index patterns 2、定义Discover(Search 查询数据) 3、定义Visualizations 3.1 定义Vertical Bar 3.2 、Choose a source 3.3、定义图表 4、定义…

spring boot中常用的安全框架 Security框架 利用Security框架实现用户登录验证token和用户授权(接口权限控制)

spring boot中常用的安全框架 Security 和 Shiro 框架 Security 两大核心功能 认证 和 授权 重量级 Shiro 轻量级框架 不限于web 开发 在不使用安全框架的时候 一般我们利用过滤器和 aop自己实现 权限验证 用户登录 Security 实现逻辑 输入用户名和密码 提交把提交用户名和…

mysql的存储引擎以及适用场景

目录 mysql的体系结构 存储引擎简介 三种存储引擎的区别 如何选择使用哪种的存储引擎&#xff1f; mysql的体系结构 连接层 最上层是一些客户端的链接服务&#xff0c;主要完成一些类似于连接处理&#xff0c;授权认证&#xff0c;以相关的安全方案。服务器也会为安全接入每…

位运算修行手册

*明明自觉学会了不少知识&#xff0c;可真正开始做题时&#xff0c;却还是出现了“一支笔&#xff0c;一双手&#xff0c;一道力扣&#xff08;Leetcode&#xff09;做一宿”的窘境&#xff1f;你是否也有过这样的经历&#xff0c;题型不算很难&#xff0c;看题解也能弄明白&am…

Spring中事务失效的8中场景

1. 数据库引擎不支持事务 这里以 MySQL为例&#xff0c;MyISAM引擎是不支持事务操作的&#xff0c;一般要支持事务都会使用InnoDB引擎&#xff0c;根据MySQL 的官方文档说明&#xff0c;从MySQL 5.5.5 开始的默认存储引擎是 InnoDB&#xff0c;之前默认的都是 MyISAM&#xff…

【node】使用express+gitee搭建图床,并解决防盗链问题

首先创建一个gitee的项目&#xff0c;详细步骤我就不一一说明 注解&#xff1a;大家记得将这个项目开源&#xff0c;还有记得获取自己的私钥&#xff0c;私钥操作如下&#xff1a; node依赖下载&#xff1a; "axios": "cors": "express"…

FPGA设计时序分析一、时序路径

目录 一、前言 二、时序路径 2.1 时序路径构成 2.2 时序路径分类 2.3 数据捕获 2.4 Fast corner/Slow corner 2.5 Vivado时序报告 三、参考资料 一、前言 时序路径字面容易简单地理解为时钟路径&#xff0c;事实时钟存在的意义是为了数据的处理、传输&#xff0c;因此严…

记一次简单的MySql注入试验

试验环境&#xff1a; 1.已经搭建好的php服务器&#xff0c;并可以通过访问到localhost/index.php&#xff1b; 2.已经安装好数据库&#xff0c;并创建表test&#xff0c;表内有name、age等字段&#xff0c;并随便创建几个假数据用于测试&#xff1b;如图&#xff1a; 开始测…

docker 禅道 远程链接 MySQL

主要的坑在下边 红色字体&#xff1a;认真看 第一种方法 搜索镜像 docker search zentao 拉取镜像 docker pull easysoft/zentao:latest 启动容器 –name [容器名] 设置容器名称 -p [主机端口]:80 绑定端口 -v /home/zentao/zentaopms:/www/zentaopms 挂载数据目录 /h…

idea中Easy Code模版配置

首先找到模版位置 找到使用的模版&#xff0c;我用的是MybatisPlus-H,这是我新建的一个模版 controller.java.vm模版 ##导入宏定义 $!{define.vm}##设置表后缀&#xff08;宏定义&#xff09; #setTableSuffix("Controller")##保存文件&#xff08;宏定义&#xff…

PHP8知识详解:PHP8开发工具VS Code的安装

作为PHP8的开发工具有很多&#xff0c;具有IDE功能的有phpstorm、Visual Studio Code、Sublime Text、NetBeans、Eclipse、Codelobster、PHP Designer等&#xff0c;当然还有很多轻量的工具&#xff0c;比如Notepad、Editplus等。本文给你介绍的是万能编辑器Visual Studio Code…

Python基于PyTorch实现循环神经网络回归模型(LSTM回归算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 LSTM网络是目前更加通用的循环神经网络结构&#xff0c;全称为Long Short-Term Memory&#xff0c;翻…

计算机视觉(二)图像特征提取

文章目录 颜色特征量化颜色直方图适用颜色空间&#xff1a;RGB、HSV等颜色空间操作 几何特征边缘 Edge边缘定义边缘提取 基于关键点的特征描述子引入几何特征&#xff1a;关键点几何特征&#xff1a;Harris角点FAST角点检测几何特征&#xff1a;斑点局部特征&#xff1a;SIFT预…

GPT-4 模型详细教程

GPT-4&#xff08;Generative Pretrained Transformer 4&#xff09;是 OpenAI 的最新语言生成模型&#xff0c;其在各类文本生成任务中表现优秀&#xff0c;深受开发者和研究者喜爱。这篇教程将帮助你理解 GPT-4 的基本概念&#xff0c;并向你展示如何使用它来生成文本。 什么…

前端vue入门(纯代码)35_导航守卫

星光不问赶路人&#xff0c;时光不负有心人 【33.Vue Router--导航守卫】 导航守卫 正如其名&#xff0c;vue-router 提供的导航守卫主要用来通过跳转或取消的方式守卫导航。有多种机会植入路由导航过程中&#xff1a;全局的, 单个路由独享的, 或者组件级的。 记住参数或查…

uniapp JS文件里面调用自定义组件(不用每个页面在template中加组件标签)

前言 工具&#xff1a;uniapp 开发端&#xff1a;微信小程序 其他&#xff1a;uview 2.0 场景&#xff1a;路由器里面&#xff0c;统一验证是否已登录&#xff0c;如果没登录&#xff0c;则直接弹出登录弹窗出来&#xff0c;不管哪个页面都如此。 效果如下&#xff1a; 直接上…