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

刷题笔记:力扣第28题-找出字符串中第一个匹配项的下标

1.拿到题目首先想到的就是暴力匹配法遍历haystack字符串当找到与needle第一个字符相同的字符时进入内部循环判断后续的字符是否都匹配如果匹配则返回下标值如果不匹配则break继续遍历。2.基于以上思想可写出完整代码如下1. int strStr(char* haystack, char* needle) { 2. int len1 strlen(haystack); // 主串长度长的那个 3. int len2 strlen(needle); // 模式串长度短的那个 4. 5. // 边界条件模式串比主串还长一定不可能匹配 → 返回 -1 6. if (len2 len1){ 7. return -1; 8. } 9. 10. // 遍历主串尝试每一个可能的起点 i 11. for (int i 0; i len1; i){ 12. 13. // 剪枝剩余长度不够了直接返回 -1 14. // 含义从 i 开始剩下的字符 len2肯定匹配不到 15. if (len1 – i len2){ 16. return -1; 17. } 18. 19. // 只有当前字符等于 needle 的第一个字符才进入第二层循环 20. if (haystack[i] needle[0]){ 21. int j; 22. // 逐个比较后续字符 23. for (j 1; j len2; j){ 24. if (haystack[i j] ! needle[j]){ 25. break; // 字符不匹配跳出第二层循环换 i1 重试 26. } 27. } 28. // 如果 j 走到了 len2说明全部字符都匹配上了 29. if (j len2){ 30. return i; // 返回起始下标 i 31. } 32. } 33. } 34. 35. // 遍历完都没找到 36. return -1; 37. }其中有两次边界判断第一次if (len2 len1)是排除待查找字符串比主字符串短的特殊情况第二次if (len1 – i len2)是为了进行边界剪枝如果主字符串剩余长度小于待查找字符串长度则直接return -1。该算法的时间复杂度为O(N×M)N和M分别为两个字符串的长度空间复杂度为O(1)。3.本题最优的解法为KMPKnuth-Morris-Pratt算法它的原则是主字符串haystack的指针i永远不回退一直往前走。当遇到不匹配的时候KMP算法会根据已知的信息把单词needle向右多滑动一点而不是只滑动一格。要想实现这个想法需要用到pi数组它记录了needle自己本身的对称性具体来说就是“最长相同的前后缀长度”。当不匹配的时候KMP算法会查看pi数组对应的值直接跳到合适的位置继续进行匹配。4.pi数组的相关代码如下其中m为needle字符串的长度1. int pi[m]; 2. pi[0] 0; // 第一个字符显然小抄是 0 3. 4. // i 是后缀的末尾j 是前缀的末尾同时也是当前相同部分的长度 5. for (int i 1, j 0; i m; i) { 6. 7. // 【核心难点】如果不匹配了怎么办 8. while (j 0 needle[i] ! needle[j]) { 9. // j 退回到它上一个成功匹配的位置查之前写好的小抄 10. // 就像找备胎当前备胎不行就看看备胎的备胎行不行 11. j pi[j - 1]; 12. } 13. 14. // 如果匹配上了 15. if (needle[i] needle[j]) { 16. j; // 相同部分的长度 1 17. } 18. 19. // 把当前算出来的长度写进小抄里 20. pi[i] j; 21. }使用pi数组的代码如下1. // i 是主串的指针永远向前不回退 2. // j 是单词 needle 的指针遇到不匹配就查小抄回退 3. for (int i 0, j 0; i n; i) { 4. 5. // 发现不匹配 6. while (j 0 haystack[i] ! needle[j]) { 7. // 主串指针 i 不动 8. // 单词指针 j 查小抄看看应该把单词滑动到哪个位置继续比 9. j pi[j - 1]; 10. } 11. 12. // 发现匹配上了 13. if (haystack[i] needle[j]) { 14. j; // 单词指针往下走一格 15. } 16. 17. // 如果 j 走到了单词的末尾说明全匹配上了 18. if (j m) { 19. // 返回起点的位置。当前在 i单词长度是 m所以起点是 i - m 1 20. return i - m 1; 21. } 22. }该算法的时间复杂度为O(N M)是最优的解法。KMP算法十分精妙具体原理建议看网上讲解视频后面再遇到类似题目的时候要多加练习。

相关文章:

刷题笔记:力扣第28题-找出字符串中第一个匹配项的下标

1.拿到题目首先想到的就是暴力匹配法,遍历haystack字符串,当找到与needle第一个字符相同的字符时进入内部循环,判断后续的字符是否都匹配,如果匹配则返回下标值,如果不匹配则break,继续遍历。2.基于以上思想…...

GLM-4-9B-Chat-1M模型快速部署:vLLM加速推理与Chainlit前端调用详解

GLM-4-9B-Chat-1M模型快速部署:vLLM加速推理与Chainlit前端调用详解 1. 模型简介与核心能力 GLM-4-9B-Chat-1M是智谱AI推出的最新一代开源对话模型,基于GLM-4架构开发,具备以下核心能力: 超长上下文支持:支持1M&…...

Gemma-3 Pixel Studio精彩案例:从模糊截图到精准技术问答全过程

Gemma-3 Pixel Studio精彩案例:从模糊截图到精准技术问答全过程 1. 引言:一张截图引发的技术探索 前几天,我在一个技术社区闲逛,偶然看到一张截图。截图里是一段代码,但分辨率不高,有些地方甚至有点模糊。…...

OpticStudio偏振分析实战:从琼斯矩阵到双折射的5个关键技巧

OpticStudio偏振分析实战:从琼斯矩阵到双折射的5个关键技巧 偏振光学设计是光学工程师面临的核心挑战之一。无论是激光系统、光纤通信还是AR/VR显示设备,偏振控制都直接影响着系统的性能和可靠性。本文将深入探讨OpticStudio中五种关键的偏振分析技术&am…...

java web学习笔记--后端进阶(二)SpringBoot原理

Java Web 学习笔记 —— 后端进阶(二):Spring Boot 原理深度解析(2026 年视角) Spring Boot 的“魔法”其实就是一套精心设计的约定 > 配置 自动装配 事件驱动 生命周期管理机制。 到 2026 年,Sprin…...

Realtek 8852CE网卡Linux驱动全攻略:从故障排查到性能优化

Realtek 8852CE网卡Linux驱动全攻略:从故障排查到性能优化 【免费下载链接】rtw89 Driver for Realtek 8852AE, an 802.11ax device 项目地址: https://gitcode.com/gh_mirrors/rt/rtw89 诊断硬件兼容性的3个步骤 当你在会议室突然断网时,是否怀…...

SEER‘S EYE预言家之眼效果对比:与传统规则引擎在推理游戏中的表现

SEERS EYE预言家之眼效果对比:与传统规则引擎在推理游戏中的表现 1. 引言 想象一下,你正在玩一局狼人杀。作为预言家,你每晚可以查验一名玩家的身份。你的对手,可能是严格按照“如果A发言有漏洞,则投票给A”这类规则…...

如何快速优化暗影精灵笔记本性能:开源硬件控制工具终极指南

如何快速优化暗影精灵笔记本性能:开源硬件控制工具终极指南 【免费下载链接】OmenSuperHub 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 对于暗影精灵笔记本用户来说,硬件性能优化一直是个头疼的问题。OmenSuperHub这款开源工具通…...

【01】什么是机器学习?理论基础与技术要点

一、定义与核心特征 机器学习作为人工智能的核心分支,其本质是通过设计高效算法,使计算机系统无需显式编程指令,即可从数据中自主挖掘内在规律与关联关系,并基于习得的模式完成预测、分类、决策等各类任务的技术体系。与传统编程…...

OpenClaw技能开发入门:为GLM-4.7-Flash扩展自定义文件转换器

OpenClaw技能开发入门:为GLM-4.7-Flash扩展自定义文件转换器 1. 为什么需要自定义技能 去年我在整理技术文档时,经常需要将PDF格式的论文和报告转换成Markdown格式。手动操作不仅耗时,还容易出错。当我发现OpenClaw可以通过技能扩展实现自动…...

rl-agents项目实战:如何自定义你的强化学习环境与智能体配置文件?

RL-Agents项目实战:深度定制强化学习环境与智能体配置指南 引言 当你第一次成功运行rl-agents示例代码时,那种兴奋感可能还记忆犹新。但很快,你会面临一个更实际的挑战:如何将这个框架适配到自己的研究项目中?与大多数…...

BEYOND REALITY Z-Image实际效果:眼镜/项链/耳环等配饰与皮肤自然接触渲染

BEYOND REALITY Z-Image实际效果:眼镜/项链/耳环等配饰与皮肤自然接触渲染 1. 项目概述 BEYOND REALITY Z-Image是一款基于先进AI技术的文生图创作引擎,专门针对高精度写实人像生成进行了深度优化。该系统结合了Z-Image-Turbo底座架构和BEYOND REALITY…...

NEURAL MASK 在嵌入式视觉系统中的轻量化部署实践

NEURAL MASK 在嵌入式视觉系统中的轻量化部署实践 最近在做一个工业质检的项目,客户要求摄像头端就能实时处理视频流,发现异常立刻报警,根本等不及把视频传到云端再分析。这让我想起了之前研究过的NEURAL MASK技术,它在图像修复和…...

如何通过Win11Debloat实现Windows系统深度优化:从性能提升到隐私保护的全流程指南

如何通过Win11Debloat实现Windows系统深度优化:从性能提升到隐私保护的全流程指南 【免费下载链接】Win11Debloat 一个简单的PowerShell脚本,用于从Windows中移除预装的无用软件,禁用遥测,从Windows搜索中移除Bing,以及…...

【Unity进阶】AudioSource 实战技巧与性能优化指南

1. AudioSource基础操作与实战技巧 AudioSource是Unity中最常用的音频组件之一,掌握它的基础操作是游戏开发的必备技能。在实际项目中,我发现很多开发者只是简单调用Play()和Stop(),其实AudioSource还有很多实用的功能值得挖掘。 1.1 精准控制…...

杭电网安复试编程Day24

1、十六进制转换题目描述&#xff1a;输入一个十进制的数&#xff0c;把它转成十六进制。 方法一&#xff1a;利用内置函数#include<iostream> using namespace std; int n; int main() {cin>>n;cout << hex << n << endl;return 0; }方法二&…...

微信小程序逆向实战:从源码提取到动态调试全解析

1. 微信小程序逆向工程入门指南 第一次接触微信小程序逆向时&#xff0c;我被那些加密的.wxapkg文件搞得一头雾水。经过多次实践后发现&#xff0c;逆向过程其实就像拆解一个俄罗斯套娃 - 需要层层剥离才能看到核心内容。对于开发者来说&#xff0c;掌握这套技能不仅能进行安全…...

玩过电源设计的都知道,Buck电路的双闭环控制就像炒菜放盐——调不好整锅都得翻车。今天咱们直接上干货,从数学建模到仿真验证,手把手把PI调节器的门道拆开了说

buck双闭环控制仿真降压电路PI调节器设计降压斩波电路建模和数学模型建模 建模方法有状态空间平均法&#xff0c;开关元件平均模型法&#xff0c;开关网络平均模型法提供双闭环调节器设计方案 从滤波器设计到pi调节器设计再到仿真。 从滤波器设计到建模&#xff0c;得到被控对象…...

IC封装选型与焊接实战指南:从DIP到BGA/WLCSP

1. 常见IC封装形式详解&#xff1a;从选型到焊接的工程实践在嵌入式硬件开发全流程中&#xff0c;IC封装绝非仅关乎“芯片如何装进电路板”的物理问题。它是连接芯片内部晶体管阵列与外部PCB互连网络的关键桥梁&#xff0c;直接影响信号完整性、热管理效率、制造良率、维修可行…...

售楼管理系统信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】

摘要 随着房地产行业的快速发展&#xff0c;传统的售楼管理方式逐渐暴露出效率低下、信息不透明和数据管理混乱等问题。为了提高售楼管理的效率和精准度&#xff0c;信息化管理系统的开发成为行业发展的必然趋势。售楼管理系统通过数字化手段整合客户信息、房源数据和交易流程&…...

W5500硬件TCP/IP协议栈驱动开发详解

1. W5500以太网控制器驱动技术深度解析W5500是由WIZnet公司推出的硬件TCP/IP嵌入式以太网控制器&#xff0c;其核心价值在于将完整的TCP/IP协议栈&#xff08;包括MAC、PHY、IPv4、ICMP、ARP、UDP、TCP、PPPoE等&#xff09;固化于芯片内部&#xff0c;通过SPI接口与MCU通信&am…...

TBR架构为何必须全屏Resolve

从一个根本性的矛盾说起 TBR架构有一个天才的设计:把屏幕切成小块(Tile),每个Tile在片上内存里完成所有渲染操作。片上内存快、省电、带宽大。 但这个天才设计埋下了一个根本性的矛盾—— 片上内存一次只能看到一个Tile。但下一个RenderPass可能需要看到整个屏幕。 这个…...

KLayout源码探秘:从点击“打开”到GDSII文件加载,这中间到底发生了什么?

KLayout源码探秘&#xff1a;从点击“打开”到GDSII文件加载的完整事件链解析 当你在KLayout中点击"打开"按钮时&#xff0c;一个看似简单的操作背后隐藏着精密的工程艺术。作为EDA工具链中的瑞士军刀&#xff0c;KLayout处理GDSII文件的过程犹如精密仪器的内部齿轮咬…...

Delphi 进阶实战:异常捕获+多线程,让软件更稳定、更高效!

我们完成了 Delphi 软件的打包发布&#xff0c;从零基础入门到成品发布&#xff0c;已经能独立开发并发布实用软件了。但如果想让你的软件更专业、更稳定&#xff0c;避免“闪退”“卡死”&#xff0c;还需要掌握两个进阶技能——这也是企业开发中必用的核心能力&#xff1a;1.…...

一文读懂-yolo26如何预测识别图片|视频|摄像头|文件夹检测适用v8v11

yolo26图片视频摄像头文件夹批量检测步骤适用v8v11一、检测代码 可以在yolo项目代码的根目录&#xff0c;新建一个python文件&#xff0c;我这里叫做detect.py&#xff0c;代码的内容如下&#xff1a; from ultralytics import YOLO if __name__ __main__:model YOLO(r&quo…...

3分钟掌握WE Learn智能助手:让你的网课学习效率提升300%

3分钟掌握WE Learn智能助手&#xff1a;让你的网课学习效率提升300% 【免费下载链接】WELearnHelper 显示WE Learn随行课堂题目答案&#xff1b;支持班级测试&#xff1b;自动答题&#xff1b;刷时长&#xff1b;基于生成式AI(ChatGPT)的答案生成 项目地址: https://gitcode.…...

创建函数和调用函数

...

基于SpringAi 开发聊天机器人

事先说明&#xff1a;采用本地部署Ollama&#xff0c;用的模块是deepseek-r1:1.5b 一、创建spring boot基础工程 二、导入相关依赖 <properties><java.version>17</java.version><spring-ai.version>1.1.3</spring-ai.version></properties&…...

CLIP-GmP-ViT-L-14图文匹配测试工具效果深度分析:互联网内容安全实战

CLIP-GmP-ViT-L-14图文匹配测试工具效果深度分析&#xff1a;互联网内容安全实战 最近在评估一些用于内容审核的AI工具&#xff0c;其中一个叫CLIP-GmP-ViT-L-14的模型引起了我的注意。它主打的是“图文匹配”&#xff0c;简单说就是能理解图片和文字之间的关系。这听起来不就…...

SGP30气体传感器原理与RT-Thread嵌入式集成实战

1. SGP30气体传感器技术解析与嵌入式系统集成实践1.1 传感器核心特性与工程定位SGP30是Sensirion公司推出的单芯片多传感元件金属氧化物&#xff08;MOx&#xff09;气体传感器&#xff0c;其设计目标是在有限空间内实现高精度、低功耗的室内空气质量监测。该器件并非传统意义上…...