【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;}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/219292.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RocketMQ的监控和管理工具有哪些❓

RocketMQ 提供了一些监控和管理工具&#xff0c;以便于用户对消息中间件的运行状态进行监控、管理和调优。以下是一些常用的 RocketMQ 监控和管理工具&#xff1a; 1. RocketMQ Console RocketMQ Console 是 RocketMQ 官方提供的监控和管理工具&#xff0c;提供了直观的图形界…

【LeetCode刷题】-- 163.缺失的区间

163.缺失的区间 class Solution {public List<List<Integer>> findMissingRanges(int[] nums, int lower, int upper) {List<List<Integer>> res new ArrayList<>();for(int num : nums){if(lower < num){res.add(Arrays.asList(lower,num -…

c语言函数与指针

//本文有待补充。 一、函数 1.函数的定义 如果程序的逻辑比较复杂、代码量比较大&#xff0c;或者重复性功能比较多&#xff0c;那么全部写在主函数里就会显得十分冗长和杂乱。为了使代码更加简洁、思路更加清晰&#xff0c;C语言提供了”函数“。函数是一个实现一定功能的语…

dockerfile创建镜像 lNMP+wordpress

dockerfile创建镜像 lNMPwordpress nginx dockernginx mysql dockermysql php dockerphp nginx vim nginx.conf vim Dockerfile docker network create --subnet172.17.0.0/16 --opt "com.docker.network.bridge.name""docker1" mynetwork docker buil…

Web是什么?它具体的功能是什么?它值不值得我们去学习?我们该如何去学习?

Web是指“World Wide Web”的缩写&#xff0c;是互联网上的一种信息系统&#xff0c;通过超文本链接方式将全球各地的文档链接在一起&#xff0c;形成一个巨大的信息资源库。Web的基本构成包括网页、超文本传输协议&#xff08;HTTP&#xff09;、网页浏览器等。 网页是Web的基…

失败的2x2 Mipi Raw10转RGB565

反转了&#xff0c;有思路改了&#xff0c;待我思考一番。 --------------------------------------------------------------------------------------------------------------------------------- 希望完成的目标&#xff1a; MIPI在解析以后是四个像素四个像素地产出数据…

最新Applestore建立其他地区账号简单快捷一看就会

1、首先打开创建appleid网站 2、点击创建你的Apple ID开始创建&#xff08;这里以美国为例&#xff09; 电话号码可以填大陆手机号即可 这两个选项建议不要勾选 3、更改付款方式 3.1点击付款与配送 3.2添加付款方式&#xff0c;这里是最重要的一步&#xff0c;传统方法已经无法…

真正的力量不是摧毁,而是在困境中保持微笑,坚持向前。

真正的力量不是摧毁&#xff0c;而是在困境中保持微笑&#xff0c;坚持向前。

Mac电脑投屏AirServer 2024怎么下载安装激活许可期限

对于那些想要将 iPhone、iPad 或其他 iOS 设备上的小屏幕镜像到计算机上的大屏幕的人来说&#xff0c;AirPlay 是一个很好的工具。 基于此&#xff0c;AirServer 非常需要将您的 Mac 或 PC 变成 AirPlay 设备。 但是如何使用计算机上的设置对 iPhone 等 iOS 设备进行屏幕镜像&a…

docker save多个镜像打包成一个tar.gz压缩文件

docker save多个镜像打包成一个tar.gz压缩文件 有时候我们需要将docker中的多个镜像批量的传输到另一台机器&#xff0c;如果通过docker save这种命令则需要制作多个tar文件&#xff0c;这样以来冗余的操作较多而且tar文件占据的空间较大&#xff0c;不利于传输。 可以通过以…

Netperf使用总结

什么是Netperf Netperf是由惠普公司开发的一种网络性能测量工具&#xff0c;主要针对基于TCP或UDP的传输。Netperf根据应用的不同&#xff0c;可以进行不同模式的网络性能测试&#xff0c;即批量数据传输&#xff08;bulk data transfer&#xff09;模式和请求/应答&#xff0…

Ubuntu 22安装PHP环境

参考博客为《练习 0&#xff08;2/2&#xff09;&#xff1a;Ubuntu 环境下安装PHP&#xff08;PHP-FPM&#xff09;》和《原生态Ubuntu部署LAMP环境 PHP8.1MySQLApache》 sudo apt-get install -y php7.4想要安装php7.4&#xff0c;发现安装的是php8.1。 完成如下图&#xf…

超声波测距HC-SR04模块的简单应用

文章目录 一、HC-SR04HC-SR04是什么&#xff1f;HC-SR04测距的原理 二、使用步骤1.硬件最远探测距离调节硬件连接 2.软件1.初始化配置代码如下&#xff08;示例&#xff09;&#xff1a;引脚初始化定时器初始化 2.引脚输入输出配置代码如下&#xff08;示例&#xff09;&#x…

【linux系统】用户功能与权限详细总结

前言 菜某的笔记总结&#xff0c;有错误还请指正。 linux用户的概念与root用户 这么理解&#xff1a;一台电脑有多个操作者&#xff0c;每个操作者只能无限制操作自己文件夹中的东西&#xff0c;其他地方的操作需要给与相应权限才能操作。 root用户&#xff1a;就是最高级的…

【Java系列】详解多线程(二)——Thread类及常见方法(上篇)

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【Java系列专栏】【JaveEE学习专栏】 本专栏旨在分享学习Java的一点学习心得&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 一…

Proxmox创建CentOS虚拟机

文章目录 下载ISO安装文件上传创建虚拟机启动虚拟机设置DNS CentOS配置国内安装源备份原有安装源下载更新国内源清理yum缓存制作新配置文件缓存 下载ISO安装文件 下载地址&#xff1a;https://www.xitongzhijia.net/ 也可去官网进行下载 上传 下面介绍直接通过页面上传&…

【论文阅读笔记】M3Care: Learning with Missing Modalities in Multimodal Healthcare Data

本文介绍了一种名为“MCare”的模型&#xff0c;旨在处理多模态医疗保健数据中的缺失模态问题。这个模型是端到端的&#xff0c;能够补偿病人缺失模态的信息&#xff0c;以执行临床分析。MCare不是生成原始缺失数据&#xff0c;而是在潜在空间中估计缺失模态的任务相关信息&…

idea一些报错

java: 非法字符: \ufeff 使用IDEA修改文件编码 在IDEA右下角&#xff0c;将编码改为GBK&#xff0c;再转为UTF-8&#xff0c;重新启动项目。具体步骤如下&#xff1a; 在IDEA右下角找到UTF-8字样的编码格式设计项&#xff0c;点击选择第一项GBK&#xff0c;然后Convert&#xf…

JVM虚拟机系统性学习-对象的创建流程及对象的访问定位

对象的创建流程与内存分配 对象创建流程如下&#xff1a; Java 中新创建的对象如何分配空间呢&#xff1f; new 的对象先放 Eden 区&#xff08;如果是大对象&#xff0c;直接放入老年代&#xff09;当 Eden 区满了之后&#xff0c;程序还需要创建对象&#xff0c;则垃圾回收…

设计模式——原型模式代码示例

引言 原型是一种创建型设计模式&#xff0c; 使你能够复制对象&#xff0c; 甚至是复杂对象&#xff0c; 而又无需使代码依赖它们所属的类。 所有的原型类都必须有一个通用的接口&#xff0c; 使得即使在对象所属的具体类未知的情况下也能复制对象。 原型对象可以生成自身的完…