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

【LeetCode】28. 找出字符串中第一个匹配项的下标 【字符串单模匹配:KMP算法】

题目链接

在这里插入图片描述

在这里插入图片描述

Python3

直觉解法

class Solution:def strStr(self, haystack: str, needle: str) -> int:pn, ph = 0, 0n = len(needle) h = len(haystack)while ph < h:if haystack[ph] == needle[pn]:if pn == n-1: # 1234   123return ph - len(needle) + 1else: pn += 1ph += 1else: ## 1234  122ph = ph - pn + 1pn = 0return -1

方法一: 暴力解法 ⟮ O ( n × m ) 、 O ( 1 ) ⟯ \lgroup O(n\times m)、O(1) \rgroup O(n×m)O(1)⟯

class Solution:def strStr(self, haystack: str, needle: str) -> int:for i in range(0, len(haystack)-len(needle)+1):if haystack[i:i+len(needle)] == needle:return i return -1

在这里插入图片描述

⭐ 方法二:Knuth-Morris-Pratt 算法 [KMP算法] ⟮ O ( m + n ) 、 O ( m ) ⟯ \lgroup O(m+n)、O(m) \rgroup O(m+n)O(m)⟯ 【空间换时间】

在这里插入图片描述
在这里插入图片描述
从而实现 更快地 跳转

在这里插入图片描述
参考链接1
参考链接2: KMP字符串匹配算法2

官方解法链接

class Solution:def strStr(self, haystack: str, needle: str) -> int:h = len(haystack)n = len(needle)# 获取 needle 的前缀信息lis = [0] * n j = 0  # 前后  子串长度for i in range(1, n): # 需要前后比较, 1个字符无法比较,因此从 i=1 开始while j > 0 and needle[i] != needle[j]: j = lis[j-1] # 和之前 相等的长度一样if needle[i] == needle[j]:j += 1  lis[i] = j # 0  1 2 3 4 5 6# a  a b a a a b   needle# 0  1 0 1 2 2 3  前缀子串 后缀子串 相同的长度  若是 needle[j] 不匹配了,注意是 lis[j-1] 存储的才是 待比较的下一个 j# a  a c a a# 根据上述的 信息进行 匹配j = 0  # 遍历 needle 下标for i in range(0, h): # 遍历 haystack 下标while j > 0 and haystack[i] != needle[j]:  #               j = lis[j-1]  # 这里 根据 前后缀 信息  快速跳转  if haystack[i] == needle[j]:j += 1if j == n: # needle 已全部匹配 因为前面的if 成立,j多加了1 return i - n + 1return -1 

在这里插入图片描述
链接

class Solution:def strStr(self, haystack: str, needle: str) -> int:def get_next():for i in range(1, len(needle)):k =[i-1]while needle[i] != needle[k]:if k == 0:k -= 1break else:k =[k-1][i] = k+1n = len(needle)= [0] * n get_next()   # 生成 needle 的next 数组i = 0 j = 0 while i < len(haystack):if haystack[i] == needle[j]:i += 1j += 1elif j == 0:i += 1else:j =[j-1]if j >= n:return i - n return -1

C++

KMP 算法 ⟮ O ( h + n ) 、 O ( n ) ⟯ \lgroup O(h+n)、O(n) \rgroup O(h+n)O(n)⟯

class Solution {
public:int strStr(string haystack, string needle) {int h = haystack.size(), n = needle.size();vector<int> lis(n);for (int i = 1, j = 0; i < n; ++i){while (j > 0 && needle[i] != needle[j]){j = lis[j-1];}if (needle[i] == needle[j]){++j;}lis[i] = j;}for (int i = 0, j = 0; i < h; ++i){while (j > 0 && haystack[i] != needle[j]){j = lis[j-1];}if (haystack[i] == needle[j]){++j;}if (j == n){return i - n + 1;}}return -1;}
};

暴力解法

class Solution {
public:int strStr(string haystack, string needle) {int h = haystack.size(), n = needle.size();int j = 0, i = 0;while (i < h){if (haystack[i] == needle[j]){if (j == n-1){return i - n + 1;}else{++j;++i;}}else{j = 0;i = i - j + 1;}}return -1;}
};

相关文章:

  • 【Hadoop_04】HDFS的API操作与读写流程
  • 《地理信息系统原理》笔记/期末复习资料(10. 空间数据挖掘与空间决策支持系统)
  • AI全栈大模型工程师(二十三)用 PyTorch 训练一个最简单的神经网络
  • 微信小程序:上传图片到别的域名文件下
  • element日历组件只显示月和日,把年份隐藏掉
  • 电脑入门基础知识
  • “百里挑一”AI原生应用亮相,百度智能云千帆AI加速器首个Demo Day来了!
  • ​configparser --- 配置文件解析器​
  • 高通平台开发系列讲解(USB篇)MBIM协议详解
  • 蚂蚁SEO的百度蜘蛛池有哪些优势
  • 搜索引擎和网络浏览器之间的区别
  • filebeat 后端运行,自动退出解决
  • Layui深入
  • 【Spark精讲】Spark任务运行流程
  • uni-app应用设置 可以根据手机屏幕旋转进行 (横/竖) 屏切换
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • 10个确保微服务与容器安全的最佳实践
  • 2019.2.20 c++ 知识梳理
  • Android开源项目规范总结
  • CSS中外联样式表代表的含义
  • Elasticsearch 参考指南(升级前重新索引)
  • ES6核心特性
  • Java多态
  • Median of Two Sorted Arrays
  • Redis 中的布隆过滤器
  • SpringBoot几种定时任务的实现方式
  • Spring核心 Bean的高级装配
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • WebSocket使用
  • 从零搭建Koa2 Server
  • 聊聊flink的TableFactory
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 如何使用Mybatis第三方插件--PageHelper实现分页操作
  • 思维导图—你不知道的JavaScript中卷
  • 听说你叫Java(二)–Servlet请求
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 一个项目push到多个远程Git仓库
  • 回归生活:清理微信公众号
  • 通过调用文摘列表API获取文摘
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • !!java web学习笔记(一到五)
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • (转)Oracle 9i 数据库设计指引全集(1)
  • .NET MAUI学习笔记——2.构建第一个程序_初级篇
  • .net 程序发生了一个不可捕获的异常
  • .net 无限分类
  • .net遍历html中全部的中文,ASP.NET中遍历页面的所有button控件
  • .net解析传过来的xml_DOM4J解析XML文件
  • .Net下C#针对Excel开发控件汇总(ClosedXML,EPPlus,NPOI)
  • [ Linux 长征路第五篇 ] make/Makefile Linux项目自动化创建工具
  • [20150707]外部表与rowid.txt