首页 > 其他分享 >代码随想录Day9|

代码随想录Day9|

时间:2023-05-25 23:13:56浏览次数:55  
标签:charAt Day9 int 代码 needle 随想录 next KMP 前缀

28. 实现 strStr()


 

在一个串中查找是否出现过另一个串,这是KMP的看家本领

说到KMP,先说一下KMP这个名字是怎么来的,为什么叫做KMP呢。

因为是由这三位学者发明的:Knuth,Morris和Pratt,所以取了三位学者名字的首字母。所以叫做KMP


 

KMP主要应用在字符串匹配上。

KMP的主要思想是当出现字符串不匹配时,可以知道一部分之前已经匹配的文本内容,可以利用这些信息避免从头再去做匹配了。

所以如何记录已经匹配的文本内容,是KMP的重点,也是next数组肩负的重任。


写过KMP的同学,一定都写过next数组,那么这个next数组究竟是个啥呢?

next数组就是一个前缀表(prefix table)。

前缀表有什么作用呢?

前缀表是用来回退的,它记录了模式串与主串(文本串)不匹配的时候,模式串应该从哪里开始重新匹配,注意这里说的是被寻找的对象而不是探寻的那个长长的字符串


 

 

class Solution {
    public int strStr(String haystack, String needle) {
        if(needle.length()==0){
            return 0;
        }
        int[] next = nexttable(needle);
        int j = -1;
        for(int i = 0; i < haystack.length(); i++){
            while(j >= 0 && haystack.charAt(i) != needle.charAt(j+1)){
                j = next[j];
            }
            if(haystack.charAt(i) == needle.charAt(j+1)){
                j++;
            }
            if(j == needle.length()-1){
                return (i-needle.length()+1);
            }
        }

        return -1;
    }
    public int[] nexttable(String needle){
        int len = needle.length();
        int j = -1;
        int[] result = new int[len];
        result[0] = j;
        for(int i = 1; i < len; i++){
                while( j >= 0 && needle.charAt(i) != needle.charAt(j+1)){
                    j = result[j];
                }
                if (needle.charAt(i) == needle.charAt(j+1)) j += 1;
                result[i] = j;
        }
        return result;
    }
}

 


 

决定放过我自己 明天再看看

 

 459.重复的子字符串  (本题可以跳过)

 

本题算是KMP算法的一个应用,不过 对KMP了解不够熟练的话,理解本题就难很多。 

我的建议是 KMP和本题,一刷的时候 ,可以适当放过,了解怎么回事就行,二刷的时候再来硬啃

 

题目链接/文章讲解/视频讲解:https://programmercarl.com/0459.%E9%87%8D%E5%A4%8D%E7%9A%84%E5%AD%90%E5%AD%97%E7%AC%A6%E4%B8%B2.html

 


再一次强调了什么是前缀,什么是后缀,什么又是最长相等前后缀。

前缀:指不包含最后一个字符的所有以第一个字符开头的连续子串。

后缀:指不包含第一个字符的所有以最后一个字符结尾的连续子串。

然后针对前缀表到底要不要减一,这其实是不同KMP实现的方式,我们在KMP精讲 (opens new window)中针对之前两个问题,分别给出了两个不同版本的的KMP实现。

其中主要理解j=next[x]这一步最为关键


 

复习双指针算法

 

 

 


 

标签:charAt,Day9,int,代码,needle,随想录,next,KMP,前缀
From: https://www.cnblogs.com/fangleSea/p/17433241.html

相关文章

  • 快速制作60页,3500行软著代码文档的实用教程。
    本篇文章主要讲解,制作软著代码文档的高效方法,当然不可能手动一个个复制了,这显然太笨拙,他浪费时间了。这里我给大家介绍一个更快的方式。如下是我制作好的软著代码文档:说明:申请的要求是每页50行,页眉有软件的版本信息,页码信息,页脚有作者名,或者页脚有页码和作者名均可通过。图片......
  • .net代码规范
    骆驼式命名法骆驼式命名法就是当变量名或函数名是由一个或多个单词连结在一起,而构成的唯一识别字时,第一个单词以小写字母开始;从第二个单词开始以后的每个单词的首字母都采用大写字母。小驼峰法:除第一个单词之外,其他单词首字母大写。大驼峰法:把第一个单......
  • Java 实现的计算器代码
    好的,以下是一个使用Java实现的计算器代码:importjava.util.Scanner;publicclassCalculator{publicstaticvoidmain(String[]args){Scannerinput=newScanner(System.in);doublenum1,num2,result;charoperator;System......
  • 代码执行&&命令执行
    代码执行当应用在调用一些能将字符串转化成为代码的函数(比如php中的eval、assert等),没有考虑到用户能否控制这个字符。将会造成代码执行使用方法:<?phpeval($_GET['cmd']);?>访问:xx.php?x=phpinfo();注意,eval不属于函数而属于结构体,所以在构造回调函数得到后门时,eval函数无法......
  • python 格式化代码
    安装pre-commitsudoaptinstallpre-commit-yrepos:-repo:https://github.com/python/blackrev:23.3.0hooks:-id:blacklanguage_version:python3exclude:src/ratel/potargs:["--line-length","18......
  • 代码随想录算法训练营第十五天|102. 二叉树的层序遍历、226. 翻转二叉树、101. 对称二
    【参考链接】102.二叉树的层序遍历 【注意】1.队列先进先出,符合一层一层遍历的逻辑,而用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。而这种层序遍历方式就是图论中的广度优先遍历,只不过我们应用在二叉树上。2.遍历的时候要记录队列的大小。就可以知道哪些元素是第几层......
  • java反射代码案例
    反射案例代码点击查看代码packagecom.bh.zoo;publicclassWolfextendsAnimal{publicStringname;publicStringcolor;protectedStringblood;privateintage;publicvoideat(){System.out.println("狼吃肉");}public......
  • 淘宝天猫京东1688拼多多商品详情API接口(商品价格监控,商品上传等场景)代码对接
    抓取淘宝商品详情价格接口代码封装如下:请求方式:HTTPS POSTGET公共参数名称类型必须描述key String 是 调用key(必须以GET方式拼接在URL中)API接口 API接口secret String 是 调用密钥api_name String 是 API接口名称(包括在请求地址中)[item_search,item_get,item_search_......
  • postman上传文件显示403,body显示网页代码
     可见图片文件上传不了。 往右侧看,可得图片占用资源过多。发现有4mb。将图片压缩后成1mb后可行。   一般post上传最大为2MB,当然它可以修改。......
  • 【HarmonyOS】低代码元服务开发中的地图实现
    在元服务开发过程中,大家可能需要在应用中使用地图,如果使用SDK集成的方式,地图SDK包体积大小很大,集成后元服务大小可能会超过10M,这就超出了HAP包的大小限制。那么是否有其他途径可以在元服务中使用地图呢?笔者最近在学习AGC新推出的低代码开发元服务的文档时发现,他的景区模板(模板简介-......