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

结合 Leetcode 题探究KMP算法

一、题目

找出字符串中第一个匹配项的下标

二、思路

2.1 KMP的核心思想

  • 与普通的双层暴力遍历相比,KMP算法的精髓在于利用已匹配的前缀信息来优化搜索过程。当发生不匹配时,算法不是简单地将模式串后移一位重新开始,而是根据预先计算的next数组,直接将模式串滑动到下一个可能匹配的位置。

2.2 next数组的实质

next[i] 表示在模式串的前 i 个字符组成的子串中,最长的相等真前缀与真后缀的长度。

  • 真前缀:不包含最后一个字符的前缀

  • 真后缀:不包含第一个字符的后缀

  • 核心价值:当字符匹配失败时,next[i] 告诉我们模式串应该回溯到什么位置继续匹配

2.3 基础递推关系

next[i] 的计算基于 next[i-1] 和当前字符 pattern[i]

  1. 已知条件:若 next[i-1] = lastNextLen,表明子串 pattern[0...lastNextLen-1] 中,前 lastNextLen 个字符与后 lastNextLen 个字符完全相等

    pattern[0...lastNextLen-1] == pattern[i-lastNextLen...i-1]
  2. 关键比较:为了高效计算,利用上述 next[i-1]中已经包含的信息,比较 pattern[lastNextLen] 与 pattern[i],就可以得到next[i]

                (1) 如果相等next[i] = lastNextLen + 1(相等前后缀长度增加1)

                (2) 如果不相等:回溯到 next[lastNextLen] 继续尝试匹配

三、代码

class Solution {public int strStr(String haystack, String needle) {// 使用KMP算法// 1、得到 next 数组int[] next = getNextArray(needle);// 2、借助 next 数组完成遍历int i = 0;  // 母串指针int j = 0;  // 子串指针int m = haystack.length();int n = needle.length();while(i < m && j < n){if(j == -1 || haystack.charAt(i) == needle.charAt(j)){i++;j++;}else{j = next[j];}}return j == n ? i - n : -1; // 判断子串的指针是否已经遍历完成}private int[] getNextArray(String s){// next数组其实是不包含当前字符的使得真前缀与真后缀相同的最大长度// 也就是 next[i] 要借助 next[i-1] 和 s.charAt(i) 来得到// 若 next[i-1] = lastNextLen 可知,s 的 [0, lastNextLen-1] 对应的字符串 == s 的 [i-1-lastNextLen, i-1]// 为最大地利用现有资源,所以先判断 s.charAt(lastNextLen) ?= s.charAt(i)// 若不等,则继续回溯进行判断int len = s.length();int[] next = new int[len];next[0] = -1;int lastNext = -1;       // 记录上一个nextint i = 0;while(i < len - 1){// lastNext == -1:说明已经回溯到开头,没有公共前后缀,next[i+1] = 0// s[i] == s[lastNext]:当前字符匹配成功,最长公共前后缀长度+1if(lastNext == -1 || s.charAt(i) == s.charAt(lastNext)){  next[i + 1] = lastNext + 1;i++;lastNext++; }else{  // 字符不匹配时,利用已计算的next信息进行回溯,找到更短的相同前后缀继续尝试匹配lastNext = next[lastNext];}}  return next;}
}
http://www.dtcms.com/a/602287.html

相关文章:

  • Vue3 VueUse(组合式 API 工具库)
  • seo推广专员工作好做吗绍兴seo管理
  • 嵌入式开发中的 Git CI/CD
  • 【ZeroRange WebRTC】STUN srflx 与 ICE 连通性检查
  • 网站开发公司怎么接单外贸销售怎么找客户
  • vps如何设置网站权限曲阜市古建设计院网站
  • 公司做网站一定要钱吗旅游网站建设
  • 从零到迁移:Docker Desktop + WSL2 完整安装与迁移教程(2025-11-12实测版)
  • 制作网站的程序语言wordpress收不到
  • python Anaconda3 5.3.1(version:4.5.11)下载安装教程
  • 现在网站建设用什么语言最便宜的免费建站
  • ubuntu所有版本镜像下载链接
  • LLMs之Tool:social-analyzer的简介、安装和使用方法、案例应用之详细攻略
  • 力扣面试150题打卡
  • Celery高级配置与队列管理实战
  • 欧地希焊接机械手节气装置
  • Ansible进行Nginx编译安装的详细步骤
  • 做 理财网站有哪些问题php可以做网站
  • 双人小游戏 PVZ植物大战僵尸TV触控版 支持触摸对战手柄完美存档支持安卓低版本2.1~
  • 网站建设进展情况汇报网站文章模板
  • Leetcode 54
  • 东西湖建设局网站做网站都用什么语言
  • sdf内容小结
  • 有哪些网站可以做seo推广中国纪检监察报电子版2021
  • 直播网站开发合同无效的12种情形
  • 好看简单易做的网站手机网站网页开发教程
  • 青海住房和建设厅网站单一本地门户网站源码
  • 侯捷先生“剖析Qt容器的实现原理“
  • 重庆二级站seo整站优化排名国外流行的内容网站
  • 车载以太网 - SOME/IP简介