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

【代码随想录 字符串6.实现strstr】 KMP算法。

在这里插入图片描述

class Solution {
    public int strStr(String haystack, String needle) {
        //1.先求next数组
        int[] next = new int[needle.length()];
        getNext(next, needle);

        //2.根据next数组匹配
        int j = 0;
        for (int i = 0; i < haystack.length(); i++) {


              //如果当前不匹配,根据next数组进行回退j的位置.回退可能有多次,要用while
            while (  j>0 && haystack.charAt(i) != needle.charAt(j)){
                j=next[j-1];
            }

            
            //如果文本串和模式串当前字符一致,则进行下一位匹配
            if(haystack.charAt(i) == needle.charAt(j)) {
                j++;
            }

          


            //全部匹配完整,返回。根据当前i的值减去模式串的长度即可
            if (j == needle.length()) {
                return i-needle.length()+1;
            }

        }

        return -1;

    }

    private static void getNext(int next[], String needle) {
        //失败后寻找数组前一个,
        int j = 0; //
        next[0] = 0;
        for (int i = 1; i < needle.length(); i++) {
            //1. next[j] != next[i] ,j要进行回退。j如果等于0就没有回退的必要。
            //这里有可能不是回退一次,是多次,所以要进行while循环
           while ( j > 0 && needle.charAt(j) != needle.charAt(i)) {
                //j跳转
                j = next[j - 1];

            }
           if (needle.charAt(j) == needle.charAt(i) ) {
                j++;
            }
            //这里的j是用于回退的,i才是表示字符串中的具体下标,即为next下标,所以为i赋值。
              next[i] = j;
        }
}
}

具体的解释可以看题解。

注意的点:

1.

代码:

while (  j>0 && haystack.charAt(i) != needle.charAt(j)){
            j=next[j-1];
        }

必须要在代码:

        if(haystack.charAt(i) == needle.charAt(j)) {
            j++;
        }

之前,因为 if(haystack.charAt(i) == needle.charAt(j)) { j++; }中对j进行了修改,如果此时再进行while代码的话,就不是从当前的条件来进行判断了。

2.

while (  j>0 && haystack.charAt(i) != needle.charAt(j)){
            j=next[j-1];
        }

对于这种代码,一定要先判断 j>0,因为后面的判断条件涉及到数组下标,可能出现j小于0的情况,发生数组越界,程序报错。

相关文章:

  • 1区6.6分CHARLS最新文章解读
  • 【学习笔记】文件上传漏洞--二次渲染、.htaccess、变异免杀
  • 2025年客运从业资格证备考刷题题库
  • 7-11 分段计算居民水费
  • 告别循环!用Stream优雅处理集合
  • AI无人直播教程 ai无人直播系统 【工具下载+教程】
  • 英语学习:单复数宏
  • 【SpringCloud】从入门到精通【上】
  • 智能硬件开发革命:低代码平台+物联网
  • 山东大学离散数学第七章习题解析
  • 从零到有的游戏开发(visual studio 2022 + easyx.h)
  • HTML5元素
  • Redis主从复制原理
  • 网络安全小知识课堂(最终完结版)
  • 【10】搭建k8s集群系列(二进制部署)之安装Dashboard和CoreDNS
  • delphi idtcpserver 搭建tcp ,ssl协议服务端
  • 一文详解OpenCV环境搭建:Windows使用CLion配置OpenCV开发环境
  • 【Linux篇】缓冲区的工作原理:如何影响你程序的输入输出速度
  • 在集合中哪些可以为null,哪些不能为null;Java 集合中 null 值允许情况总结与记忆技巧
  • 蓝桥杯冲刺题单--二分
  • 百科网站开发/广州白云区今天的消息
  • 基于php网站开发/大型营销型网站制作
  • 食品网站建设日程表/电商怎么做营销推广
  • 自己有了域名 怎么做网站/哈尔滨最新信息
  • 松江区做网站的公司/网络营销经典案例
  • 经典广告推广词/seo培训学什么