leetcode28. 实现 strStr(KMP详解)

一:题目

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

二:思路

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

三:上码

// class Solution {
// public:
// int strStr(string haystack, string needle) {
//            if (needle.size()==0)
//             return 0;
//         if (needle.size() > haystack.size())
//             return -1;
//         int j=0;//用来指向needle的字符串
//         int i=0;
//         for (i = 0; i < haystack.size(); i++) {
//             if (j==needle.size()){//如果已经匹配完成则返回
//                 return i - needle.size();
//             }
//             if (haystack[i] == needle[j]){
//                 j++;
//             } else{
//                 i -= j;
//                 j=0;
//             }
//         }
//         //用来判断单个字母的时候,j++之后j=1,i=1;
//         if (j==needle.size()){
//             return i - needle.size();
//         }
//         return -1;
//     }
// };class Solution {
public:void getNext(int* next,string s){//这里的是int i = 0;//表示前缀next[0] = 0;//一个字符的话公共前后缀肯定为0//j表示后缀for(int j = 1; j < s.size(); j++) {while(i > 0 && s[i] != s[j]) {//这里的i>0是为了保证i-1大于等于0i = next[i-1];//这里是往前推,也是相当于匹配字符问题,将前一个字符所对应的下标,赋值给i,// 然后字符串开始从i所对应字符开始匹配}if(s[i] == s[j]) {i++;}next[j] = i;        }
}int strStr(string haystack, string needle) {/**思路:1.KMP算法,主要处理的是字符串匹配的问题2.这里边需要用到next数组 也就是前缀表;那么我们为什么要用前缀表呢,当我们进行匹配字符的时候发现匹配到不相同的字符的时候,那么我们就需要在匹配字符串中查询前一个字符所对应的在前缀表表中的数值,根据数值找到对应的字符 让其重新作为匹配字符串的开始匹配的位置。3.那么我们怎么求取前缀表呢?首先先明白何为前缀、后缀、最长公共前后缀<1>:前缀:前缀是指不包含最后一个字符的所有以第一个字符开头的连续子串eg:aabaaf其前缀可以是:aaaaabaabaaabaa<2>:后缀:后缀是指不包含第一个字符的所有以最后一个字符结尾的连续子串eg:aabaaf其后缀可以是:fafaafbaafabaaf<3>:最长公共前后缀:也就是给定一个字符串,我们找到其前缀和后缀相等的最长部分 eg:字符串 公共的部分  公共部分的长度a                     0aa        a           1   aab                   0aaba      a           1 aabaa     aa          2aabaaf                0<4>:根据<3>求出的公共部分我们就可以求出next数组(前缀表)字符串:  a  a  b  a  a  f下  标: 0  1  2  3  4  5 next[]:  0  1  0  1  2  04.如何用next数组来进行匹配呢?被匹配的字符串:aabaabaaf匹配的字符串:aabaaf当匹配到f的时候发现f和b此时不匹配,那么我们就需要查询匹配字符串的前一个字符所对应的next数组中的数值,然后再从还数值所读应的字符开始匹配。回归示例就是我们的f前面的字符a对应的next数组中的数值是2,那么我们就从字符串的2位置对应的字符开始匹配也就是b*/if(needle.size() == 0) {return 0;}  int next[needle.size()];    getNext(next,needle);int j = 0;//代表被匹配的字符串for(int i = 0; i < haystack.size(); i++) {while(j > 0 && needle[j] != haystack[i]){j = next[j-1];}if(needle[j] == haystack[i]) {j++;}if(j == needle.size()){return (i-j+1);//可以类比hello  和 ll}}return -1;}
};

在这里插入图片描述

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

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

相关文章

在Docker中配置ASP.NETCore的HTTPS模式

&#xff08;The Continued Rising Power of Developers&#xff09;使用HTTPS&#xff0c;让网站更安全PS&#xff1a;经过两周的学习和部署迁移&#xff0c;目前已经把所有后端都迁到了基于Docker的Jenkins里了&#xff0c;相关文章可以参考《使用Jenkins来发布和代理.NetCor…

最小堆最大堆了解吗?一文了解堆在前端中的应用

一文了解堆在前端中的应用⚡序言&#x1f998;一、堆是什么&#xff1f;&#x1f425;二、JS中的堆&#x1f41d;三、堆的应用&#x1f408;四、构建一个最小堆1. 定义2. 方法3. 用js代码实现最小堆&#xff08;1&#xff09;初始化一个堆&#xff08;2&#xff09;交换位置swa…

​如何编写高质量的C#代码(一)

如何编写高质量的C#代码&#xff08;一&#xff09;从”整洁代码“谈起一千个读者&#xff0c;就有一千个哈姆雷特&#xff0c;代码质量也同样如此。想必每一个对于代码有追求的开发者&#xff0c;对于“高质量”这个词&#xff0c;或多或少都有自己的一丝理解。当我在长沙.NET…

可视化太酷辽!一文了解排序和搜索算法在前端中的应用

一文了解排序和搜索算法在前端中的应用⏳序言&#x1f9ed;一、文章结构抢先知⌚二、排序和搜索1、定义2、JS中的排序和搜索⏰三、排序算法1、冒泡排序&#x1f4a1;&#xff08;1&#xff09;定义&#xff08;2&#xff09;实现思路&#xff08;3&#xff09;图例&#xff08;…

leetcode双指针合集

27. 移除元素 class Solution { public:int removeElement(vector<int>& nums, int val) {/**思路:使用快慢指针&#xff0c;快指针正常往后移动,并将获取的值给慢指针&#xff0c;但是当快指针所指向的值是val的时候慢指针便不再更新;**/ int slowIndex 0;for(…

网络安全逐渐成为程序员的必备技能

大家好&#xff0c;我是Z哥。不知道大家有没有发现。如今&#xff0c;曝光某些知名公司信息泄露的事件频率越来越高。与之对应的&#xff0c;网络安全问题也越来越受到重视。从百度指数摘录了两张图给大家分享下。可以看到&#xff0c;对网络安全相关的信息和关注度在逐渐走高&…

webpack入门核心知识还看不过瘾?速来围观万字入门进阶知识

一文了解webpack入门进阶知识&#x1f93e;‍♀️序言&#x1f3d3;一、Tree Shaking1. 引例阐述2. Tree Shaking配置&#x1f3f8;二、Development和Prodiction模式的区分打包1. 项目打包结构2. 共有配置webpack.common.js3. 开发环境webpack.dev.js4. 生产环境webpack.prod.j…

Power Automate生产现场实例分享回顾

Power Automate生产现场实例分享回顾8月28日&#xff08;周五&#xff09;19&#xff1a;30-21&#xff1a;00&#xff0c;Danfos智慧工厂数字化解决方案高级顾问Helena Wang通过Teams和B站为大家分享了Power Platform开发以及它在工业生产当中的应用。一、什么是低代码开发&am…

万字总结webpack实战案例配置

一文了解webpack中常见实战案例配置&#x1f6f4;序言&#x1f68c;一、Library的打包1. webpack打包库2. 库引用冲突&#x1f68d;二、PWA的打包配置1. PWA是什么2. webpack中的PWA&#x1f68e;三、TypeScript的打包配置1. 引例阐述2. webpack对ts的配置&#xff08;1&#x…

程序员过关斩将--应对高并发系统有没有通用的解决方案呢?

“灵魂拷问&#xff1a;应对高并发系统有没有一些通用的解决方案呢&#xff1f;这些方案解决了什么问题呢&#xff1f;这些方案有那些优势和劣势呢&#xff1f;对性能孜孜不倦的追求是互联网技术不断发展的根本驱动力&#xff0c;从最初的大型机到现在的微型机&#xff0c;在本…

org.apache.ibatis.executor.ExecutorException: A query was run and no Result Maps were found for the

一:报错 org.apache.ibatis.executor.ExecutorException: A query was run and no Result Maps were found for the Mapped Statement com.wyj.Dao.Bill.BillMapper.getBill. Its likely that neither a Result Type nor a Result Map was specified.二:解决 未在mapper.xml…

.NET5.0 单文件发布打包操作深度剖析

.NET5.0 单文件发布打包操作深度剖析前言随着 .NET5.0 Preview 8 的发布&#xff0c;许多新功能正在被社区成员一一探索&#xff1b;这其中就包含了“单文件发布”这个炫酷的功能&#xff0c;实际上&#xff0c;这也是社区一直以来的呼声&#xff0c;从 WinForm 的 msi 开始&am…

webpack实战之手写一个loader和plugin

webpack实战之编写一个简易的loader和plugin&#x1f514;序言&#x1f3b5;一、如何编写一个Loader1. 碎碎念2. 项目结构3. 业务代码编写&#xff08;1&#xff09;入口文件代码&#xff08;2&#xff09;编写loader&#xff08;3&#xff09;引用loader&#xff08;4&#xf…

手写一个简易bundler打包工具带你了解Webpack原理

用原生js手写一个简易的打包工具bundler&#x1f95d;序言&#x1f349;一、模块分析(入口文件代码分析)1. 项目结构2. 安装第三方依赖3. 业务代码4. 开始打包&#x1f951;二、依赖图谱Dependencies Graph1. 结果分析2. 分析所有模块的依赖关系&#x1f350;三、生成代码1. 逻…

不喜欢 merge 分叉,那就用 rebase 吧

阅读本文大概需要 3 分钟。有些人不喜欢 merge&#xff0c;因为在 merge 之后&#xff0c;commit 历史就会出现分叉&#xff0c;这种分叉再汇合的结构会让有些人觉得混乱而难以管理。如果你不希望 commit 历史出现分叉&#xff0c;可以用 rebase 来代替 merge。rebase &#xf…

你可能对position和z-index有一些误解

一文详解css中的position和z-index&#x1f9c3;序言&#x1f377;一、文章结构抢先知&#x1f378;二、position1. position的取值2. 标准文档流3. 各取值解析&#xff08;1&#xff09;static&#xff08;2&#xff09;relative&#xff08;3&#xff09;absolute&#xff08…

数据结构与算法专题——第九题 外排序

说到排序&#xff0c;大家第一反应基本上是内排序&#xff0c;是的&#xff0c;算法嘛&#xff0c;玩的就是内存&#xff0c;然而内存是有限制的&#xff0c;总有装不下的那一天&#xff0c;此时就可以来玩玩外排序&#xff0c;当然在我看来&#xff0c;外排序考验的是一个程序…

谁动了我的选择器?深入理解CSS选择器优先级

深入理解CSS选择器优先级&#x1f60f;序言&#x1f9d0;文章内容抢先看&#x1f910;一、基础知识1、为什么CSS选择器很强2、CSS选择器的一些基本概念&#xff08;1&#xff09;4种基本概念Ⅰ. 选择器Ⅱ. 选择符Ⅲ. 伪类Ⅳ. 伪元素&#xff08;2&#xff09;CSS选择器的命名空…

leetcode239. 滑动窗口最大值(思路+详解)

一&#xff1a;题目 二:思路 1.这个题不能用优先队列&#xff0c;虽然我们可以通过优先队列得到最大值&#xff0c;但是我们在移动 窗口的时候,便不可以正常的删除元素了 2.虽然不能用优先对列&#xff0c;但是我们依然希望可以得到队首的元素的时候是最大值&#xff0c;同时还…

《ASP.NET Core 与 RESTful API 开发实战》-- (第10章)-- 读书笔记

第 10 章 部署10.1 部署到 IISASP.NET Core 应用程序支持部署到 IIS 中&#xff0c;之后它将作为应用程序的反向代理服务器和负载均衡器&#xff0c;向应用程序中转传入的 HTTP 请求默认情况下&#xff0c;ASP.NET Core 项目的 Program 类使用如下方式创建 WebHostpublic stati…