news 2026/7/27 14:26:13

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LeetCode 28 找出字符串中第一个匹配项的下标

1. 题目

28. 找出字符串中第一个匹配项的下标 - 力扣(LeetCode)

题目描述

给你两个字符串haystackneedle,在haystack字符串中找出needle字符串出现的第一个位置(下标从 0 开始)。如果不存在,则返回-1

示例

输入:haystack = "sadbutsad", needle = "sad"

输出:0

输入:haystack = "leetcode", needle = "leeto"

输出:-1

约束

  • (1 <= haystack.length, needle.length <= 10^4)

  • haystackneedle仅由小写英文字符组成

2. 最佳解题思路描述(暴力双指针朴素匹配,适合入门)

  1. 遍历主串每个下标i,当haystack[i] == needle[0]时,开启子串匹配;

  2. 从 i 开始连续比对 len(needle) 个字符:

    • 全部匹配成功:直接返回起始下标i

    • 中途字符不相等:匹配失败,重置标记继续外层循环;

  3. 遍历结束无匹配返回-1

优势

逻辑直白,容易手写;无需复杂 KMP 预处理;适合题目数据范围。

时间复杂度最坏 (O(n*m)),空间 (O(1))。

3. 我的可优化代码(逻辑大体正确,存在边界 bug 与冗余变量)

class Solution { public: int strStr(string haystack, string needle) { int len = needle.size(); int num = 0; int index = -1; int flag = 0; for(int i = 0;i<haystack.size();i++){ if(haystack[i]==needle[0]){ index = i; for(int j = i;j<i+len;j++){ if(haystack[j] == needle[j-i]){ ​ } else{ index = -1; break; } } } if(index!=-1){ break; } } return index; } };

代码问题说明

  1. 数组越界风险(致命 bug)

    内层循环j < i + len没有限制j < haystack.size()

    若主串剩余字符不足len个,haystack[j]访问越界,程序崩溃。

    例:haystack="abc", needle="bcd",i=1 时 i+len=4,j 取到 3 超出下标。

  2. 无效冗余变量

    numflag定义后全程未使用,无意义,可直接删除。

  3. 空循环体可读性差

    相等时无操作,仅不相等才处理,逻辑阅读困难。

  4. 循环范围可剪枝优化

    外层i最多只需走到haystack.size() - len,超过该起点不可能完整容纳子串,减少无效循环。

4. 规范修正版代码(朴素暴力匹配,修复越界)

class Solution { public: int strStr(string haystack, string needle) { int n = haystack.size(); int m = needle.size(); // 剪枝:i最大到 n-m,再往后长度不够 for (int i = 0; i <= n - m; ++i) { bool match = true; for (int j = 0; j < m; ++j) { if (haystack[i + j] != needle[j]) { match = false; break; } } if (match) { return i; } } return -1; } };

5. 总结

  1. 原代码核心匹配逻辑思路没问题,但缺少长度边界判断,存在数组越界崩溃;

  2. 优化关键点:外层循环上限设为n-m,从根源避免内层越界;

  3. 无需多余标记变量,用 bool 记录单次匹配状态更清晰;

  4. 找到匹配起点直接 return,不用额外保存 index 再 break。

6. 相关知识拓展

拓展 1:库函数极简写法(面试仅作了解)

int strStr(string haystack, string needle) { size_t pos = haystack.find(needle); return pos == string::npos ? -1 : pos; }

底层封装匹配逻辑,面试不建议作为主力解法。

拓展 2:KMP 算法(高效线性匹配,大数据最优)

预处理 needle 得到 next 前缀数组,匹配失败时主串指针不回退,时间 (O(n+m)):

class Solution { public: int strStr(string haystack, string needle) { int n = haystack.size(), m = needle.size(); if(m == 0) return 0; vector<int> next(m,0); // 构建next数组 for(int i=1,j=0;i<m;i++){ while(j>0 && needle[i]!=needle[j]) j=next[j-1]; if(needle[i]==needle[j]) j++; next[i]=j; } // 匹配 for(int i=0,j=0;i<n;i++){ while(j>0 && haystack[i]!=needle[j]) j=next[j-1]; if(haystack[i]==needle[j]) j++; if(j==m) return i-m+1; } return -1; } };

拓展 3:复杂度对比

  1. 朴素暴力(修正版):最坏 (O(n*m)),(O(1));

  2. KMP 算法:(O(n+m)),(O(m));

  3. string::find:底层优化实现,实际效率很高。

拓展 4:易错点复盘

  1. 忘记限制外层 i 上限,导致内层访问主串越界;

  2. 多余无用变量增加代码冗余;

  3. 内层循环判断只处理不相等分支,可读性差。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/27 14:25:59

Nuxt 2 Composition API类型安全实践:TypeScript集成教程

Nuxt 2 Composition API类型安全实践&#xff1a;TypeScript集成教程 【免费下载链接】composition-api Composition API hooks for Nuxt 2. 项目地址: https://gitcode.com/gh_mirrors/com/composition-api 在现代前端开发中&#xff0c;TypeScript已成为提升代码质量和…

作者头像 李华
网站建设 2026/7/27 14:25:11

TI芯片数据手册精读与硬件设计实战指南

1. 项目概述&#xff1a;从一份数据手册开始的设计之旅 在硬件工程师的日常里&#xff0c;数据手册&#xff08;Datasheet&#xff09;的地位&#xff0c;堪比厨师的菜谱、建筑师的蓝图。它不只是一份产品说明书&#xff0c;更是一份浓缩了芯片设计团队全部心血的技术契约。今天…

作者头像 李华
网站建设 2026/7/27 14:22:20

Radix3路由库性能揭秘:为什么它比其他路由库快3倍?

Radix3路由库性能揭秘&#xff1a;为什么它比其他路由库快3倍&#xff1f; 【免费下载链接】radix3 &#x1f333; Lightweight and fast rou(ter) for JavaScript 项目地址: https://gitcode.com/gh_mirrors/ra/radix3 在现代Web开发中&#xff0c;路由库的性能直接影响…

作者头像 李华
网站建设 2026/7/27 14:22:19

我与 IT 这三十年:2012,狼性之前我离开百度

2012 年&#xff0c;我离开百度&#xff0c;去了微博。 在我的记忆里&#xff0c;那是一个微妙的时间点。百度仍然强大&#xff0c;技术积累仍然深&#xff0c;但公司气味开始有变化。后来大家常说“狼性”&#xff0c;我离开时已经能感到这种方向开始出现。 我不是因为某个具…

作者头像 李华
网站建设 2026/7/27 14:19:21

Awakened PoE Trade 终极指南:5分钟掌握流放之路高效交易助手

Awakened PoE Trade 终极指南&#xff1a;5分钟掌握流放之路高效交易助手 【免费下载链接】awakened-poe-trade :heavy_dollar_sign: :hammer: Path of Exile app for price checking 项目地址: https://gitcode.com/gh_mirrors/aw/awakened-poe-trade Awakened PoE Tra…

作者头像 李华