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

从零开始的LeetCode刷题日记:28. 实现 strStr()

一.相关链接

题目链接:28. 实现 strStr()

二.心得体会

1)KMP算法的思想

需要在一个字符串里找另一个字符串就需要用到KMP算法。KMP算法的重点是求出next数组,然后每次遇到不匹配的情况就根据数组来回退并重新匹配。

KMP算法的思想是最长相等前后缀,也就是省去再匹配前面子串的时间。

2)求next数组的流程

KMP算法求next数组的基本流程是:初始化,处理前后缀不匹配情况,处理前后缀匹配情况。

  1. 初始化:i设置为后缀末尾,j设置为前缀末尾(同时也代表了j前方的子串已经匹配成功),next[0]=0(第一个字母没有前后缀)。
  2. 处理前后缀不匹配的情况:如果不匹配,我们就需要一直向前回退,根据next[j-1]来一直回退到字符串头或者匹配为止(只有匹配了才说明存在某个前后缀长度相等且相同),本质就是不断缩小前后缀的长度以求找到匹配的最长相等前后缀。
  3. 处理前后缀匹配的情况:如果匹配,我们就可以j++,然后赋值next[i]=j,说明最长相等前后缀延长一位!
3)问题与思考

1. j的大小和所指字符的含义是什么?

答:j的大小指的是上一个子串已经成功匹配的最长前后缀长度。j所指字符是新加入子串的字符,代表当前需要进行匹配的后缀末尾。

2. 为什么是根据next[j-1]进行回退?

答:第一个解释是根据不变量原则,本质上求next数组也是一个小的查找子串的问题,因此和整个KMP所解决的问题是一致的,和KMP的流程是一样的。第二个解释是回退的本质是不断缩小前后缀长度的一个不断妥协的过程,这个过程我们可以逐个逐个向前回退来比较,但next数组记录了能够匹配的前缀位置,那么只需要让i所指字符和这些匹配了的前缀末尾来比较就可以确定next[i]了。

三.代码

1)实现KMP:

class Solution {
public:void getNextarray(int* next,string needle){//初始化int j=0;next[0]=0;//创建next数组for(int i=1;i<needle.size();i++){//处理前后缀不匹配情况while(j>0&&needle[i]!=needle[j]){j = next[j-1];}//处理前后缀匹配情况if(needle[i] == needle[j]){j++;}//赋值next[i] = j;}}int strStr(string haystack, string needle) {const int len = needle.size();int next[needle.size()];getNextarray(next,needle);int j=0;//进行KMP搜索for(int i=0;i<haystack.size();i++){//不匹配就根据next数组回退while(j>0&&haystack[i]!=needle[j]){j = next[j-1];}if(haystack[i]==needle[j]){j++;}if(j==needle.size()){//匹配完成后i指向neddle末尾,因此需要复位到开头return (i-needle.size()+1);}}return -1;}
};

2)库函数:

class Solution {
public:int strStr(string haystack, string needle) {auto result = search(haystack.begin(), haystack.end(), needle.begin(), needle.end());if (result != haystack.end())return (result - haystack.begin());else return -1;}
};

相关文章:

  • 【Java】Java使用Swing实现一个模拟计算器(有源码)
  • 入门用Hive构建数据仓库
  • 如何理解JVM
  • HTTP 摘要认证
  • vue3新手笔记
  • 【Java8新特性】四、强大的Stream api
  • 金陵科技学院软件工程学院软件工程专业
  • 韩顺平 | 零基础快速学Python(2)
  • 【.Net】Polly
  • Python 中全局变量缓存的多线程问题及优化策略
  • FPGA开源项目分享——基于 DE1-SOC 的 String Art 实现
  • 广佛站点导航助手小程序产品使用说明书
  • iOS 17.5系统或可识别并禁用未知跟踪器,苹果Find My技术应用越来越合理
  • 提升Terraform工作流程最佳实践
  • 五一假期来临,各地景区云旅游、慢直播方案设计与平台搭建
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • Angularjs之国际化
  • magento2项目上线注意事项
  • mysql 5.6 原生Online DDL解析
  • tensorflow学习笔记3——MNIST应用篇
  • 快速构建spring-cloud+sleuth+rabbit+ zipkin+es+kibana+grafana日志跟踪平台
  • 聊聊directory traversal attack
  • 面试遇到的一些题
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 前端之Sass/Scss实战笔记
  • 通信类
  • 自定义函数
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • 2017年360最后一道编程题
  • 阿里云重庆大学大数据训练营落地分享
  • ​卜东波研究员:高观点下的少儿计算思维
  • #etcd#安装时出错
  • $.ajax()参数及用法
  • (1) caustics\
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (LeetCode) T14. Longest Common Prefix
  • (独孤九剑)--文件系统
  • (附源码)ssm高校实验室 毕业设计 800008
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (转)AS3正则:元子符,元序列,标志,数量表达符
  • (转)h264中avc和flv数据的解析
  • (转)德国人的记事本
  • .NET 的程序集加载上下文
  • .NET 药厂业务系统 CPU爆高分析
  • .net反编译工具
  • .NET面试题解析(11)-SQL语言基础及数据库基本原理
  • .Net下C#针对Excel开发控件汇总(ClosedXML,EPPlus,NPOI)
  • .Net下的签名与混淆
  • .NET性能优化(文摘)
  • .Net中的设计模式——Factory Method模式
  • /usr/lib/mysql/plugin权限_给数据库增加密码策略遇到的权限问题
  • @Valid和@NotNull字段校验使用
  • [ 隧道技术 ] 反弹shell的集中常见方式(二)bash反弹shell
  • []新浪博客如何插入代码(其他博客应该也可以)