JAVA练习374- 找出字符串中第一个匹配项的下标
题目概览给你两个字符串haystack和needle请你在haystack字符串中找出needle字符串的第一个匹配项的下标下标从 0 开始。如果needle不是haystack的一部分则返回-1。示例 1输入haystack sadbutsad, needle sad 输出0 解释sad 在下标 0 和 6 处匹配。 第一个匹配项的下标是 0 所以返回 0 。示例 2输入haystack leetcode, needle leeto 输出-1 解释leeto 没有在 leetcode 中出现所以返回 -1 。提示1 haystack.length, needle.length 10^4haystack和needle仅由小写英文字符组成来源28. 找出字符串中第一个匹配项的下标 - 力扣LeetCode解题分析方法一暴力求解算法思路暴力匹配Brute Force是最直观的字符串匹配方法。从 haystack 的每个位置开始逐个字符与 needle 进行比较如果完全匹配则返回当前位置如果不匹配则从 haystack 的下一个位置重新开始比较。实现步骤遍历 haystack 的每个可能起始位置 i从 0 到 m-n对于每个起始位置 i比较 haystack[i...in-1] 与 needle[0...n-1] 的每个字符如果所有字符都匹配返回当前起始位置 i如果中途发现不匹配则从下一个起始位置 i1 重新开始比较如果遍历完所有可能起始位置都没有找到匹配返回 -1代码解析class Solution { public int strStr(String haystack, String needle) { int m haystack.length(), n needle.length(); int i 0, j 0; // 双指针遍历i 指向 haystackj 指向 needle while(i m j n) { if (haystack.charAt(i) needle.charAt(j)) { // 当前字符匹配 if (j n - 1) { // 如果 needle 的所有字符都已匹配返回起始位置 return i - j; } i; j; } else { // 当前字符不匹配回溯到下一个起始位置 i i - j 1; // i 回溯到下一个起始位置 j 0; // j 重置为 0重新开始匹配 } } return -1; // 遍历结束未找到匹配 } }时间复杂度O(m×n)其中 m 是 haystack 长度n 是 needle 长度。最坏情况下需要比较 m×n 次。空间复杂度O(1)只使用了常数级别的额外空间。优点实现简单易于理解不需要预处理。缺点效率较低当字符串较长时性能较差。方法二KMP算法思路KMPKnuth-Morris-Pratt算法通过预处理模式串needle构建 next 数组部分匹配表在匹配失败时利用已匹配的信息跳过不必要的比较避免回溯主串指针。核心概念前缀字符串的前缀是指从第一个字符开始但不包含最后一个字符的所有子串后缀字符串的后缀是指从最后一个字符结束但不包含第一个字符的所有子串最长公共前后缀长度对于模式串的每个位置计算该位置之前子串的最长相等前后缀的长度next 数组存储每个位置的最长公共前后缀长度用于匹配失败时确定模式串的移动位置实现步骤构建 next 数组预处理模式串计算每个位置的最长公共前后缀长度匹配过程使用双指针 i主串指针和 j模式串指针进行匹配如果字符匹配两个指针都向前移动如果字符不匹配且 j0根据 next 数组回退 j 指针如果字符不匹配且 j0只移动 i 指针当 j 等于模式串长度时匹配成功返回起始位置代码解析class Solution { public int strStr(String haystack, String needle) { int m haystack.length(), n needle.length(); if (n 0) return 0; // 空字符串直接返回 0 // 1. 构建 next 数组部分匹配表 int[] next new int[n]; int i 1, len 0; // len 记录当前最长公共前后缀长度 while(i n) { // 如果当前字符与 len 位置的字符匹配 while(i n needle.charAt(i) needle.charAt(len)) { len; next[i] len; // 记录当前位置的最长公共前后缀长度 i; } // 处理不匹配的情况 if (i n) { if (len 0) { // 回退到前一个最长公共前后缀的位置 len next[len - 1]; } else { // len 已经是 0当前位置的 next 值为 0 len 0; i; } } } // 2. 使用 next 数组进行匹配 i 0; // 主串指针 int j 0; // 模式串指针 while(i m j n) { // 字符匹配时两个指针都向前移动 while(i m j n haystack.charAt(i) needle.charAt(j)) { i; j; } // 如果模式串完全匹配返回起始位置 if (j n) { return i - n; } // 字符不匹配时的处理 if (j n) { if (j 0) { // 根据 next 数组回退模式串指针 i i - j next[j - 1] 1; // 主串指针移动到下一个可能匹配的位置 j next[j - 1]; // 模式串指针回退到最长公共前后缀的位置 } else { // 模式串第一个字符就不匹配只移动主串指针 i; } } } return -1; // 未找到匹配 } }时间复杂度O(mn)其中 m 是 haystack 长度n 是 needle 长度。构建 next 数组需要 O(n)匹配过程需要 O(m)。空间复杂度O(n)需要额外的 next 数组存储部分匹配信息。优点效率高避免了主串指针的回溯适合处理长字符串匹配。缺点实现相对复杂需要理解部分匹配表的概念。应用场景文本编辑器查找、IDE 代码搜索、生物信息学中的基因序列匹配等需要高效字符串匹配的场景。

相关新闻

从1家店到100家店:SD-WAN如何解决连锁企业多门店组网难题

从1家店到100家店:SD-WAN如何解决连锁企业多门店组网难题

近几年 , 连锁零售正在加速向跨区域经营发展。便利店、药店、餐饮、服饰门店往往从一个城市扩展到多个省份 , 门店数量从几十家增加到数百家。与此同时 , 收银系统、会员系统、库存同步、外卖平台、视频监控和电子价签都离不开稳定网络。网络一旦卡顿 , 影响的不只是上网体验 ,…

2026/10/24 16:05:47 阅读更多 →
Xiaomi Miloco实战指南:从零构建智能家居AI管家

Xiaomi Miloco实战指南:从零构建智能家居AI管家

Xiaomi Miloco实战指南:从零构建智能家居AI管家 【免费下载链接】xiaomi-miloco Xiaomi Miloco 项目地址: https://gitcode.com/gh_mirrors/xi/xiaomi-miloco 你是否想过拥有一个能够真正理解家庭环境、识别家庭成员、主动提供贴心服务的AI管家?X…

2026/10/24 23:28:27 阅读更多 →
跨平台Lyra语音编解码器集成指南:高效部署与性能优化

跨平台Lyra语音编解码器集成指南:高效部署与性能优化

跨平台Lyra语音编解码器集成指南:高效部署与性能优化 【免费下载链接】lyra A Very Low-Bitrate Codec for Speech Compression 项目地址: https://gitcode.com/gh_mirrors/lyra3/lyra Lyra是一款基于生成式神经网络的低比特率语音编解码器,能够在…

2026/10/25 19:11:09 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/10/26 12:00:21 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/10/25 22:36:10 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/10/26 4:52:12 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/10/26 12:00:21 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/10/26 5:00:37 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/10/26 3:16:46 阅读更多 →

日新闻

周新闻

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/26 12:00:19 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/25 13:21:54 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/26 8:34:37 阅读更多 →