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

【每日算法】找出字符串中第一个匹配项的下标 LeetCode

1. 暴力匹配 + 优化

public int StrStr(string haystack, string needle)
{if (needle.Length == 0) return 0;if (haystack.Length < needle.Length) return -1;for (int i = 0; i < haystack.Length - needle.Length + 1; i++){if (haystack[i] == needle[0]){bool isMatch = true;for (int j = 1; j < needle.Length; j++){if (haystack[i + j] != needle[j]){isMatch = false;break;}}if (isMatch) return i;}}return -1;
}
逻辑分析
  1. 边界检查

    • 如果 needle 为空,直接返回 0 。
    • 如果 haystack 比 needle 短,直接返回 -1 。
  2. 外层循环

    • 遍历 haystack 的每一个可能的起始位置 i (从 0 到 haystack.Length - needle.Length )。
  3. 内层匹配

    • 如果 haystack[i] 和 needle[0] 匹配,则进入内层循环:
      • 逐个比较 haystack[i + j] 和 needle[j] 。
      • 如果发现不匹配,标记 isMatch = false 并跳出内层循环。
    • 如果所有字符都匹配,返回当前起始位置 i 。
  4. 时间复杂度

    • 最坏情况下为 O(n * m) ( n 是 haystack 长度, m 是 needle 长度)。

2. 双指针方法

public int StrStr(string haystack, string needle)
{if (needle.Length == 0) return 0;if (haystack.Length < needle.Length) return -1;int n = haystack.Length;int m = needle.Length;for (int i = 0; i <= n - m; i++){int j = 0;while (j < m && haystack[i + j] == needle[j]){j++;}if (j == m) return i;}return -1;
}
逻辑分析
  1. 边界检查

    • 如果 needle 为空,直接返回 0 。
    • 如果 haystack 比 needle 短,直接返回 -1 。
  2. 外层循环

    • 遍历 haystack 的每一个可能的起始位置 i 。
  3. 双指针匹配

    • 使用指针 j 从 0 开始,逐个比较 haystack[i + j] 和 needle[j] 。
    • 如果字符匹配, j 向后移动;否则跳出循环。
    • 如果 j 移动到 needle 的末尾( j == m ),说明匹配成功,返回 i 。
  4. 时间复杂度

    • 最坏情况下为 O(n * m) ,但实际运行中可能比你的代码更高效(因为减少了 isMatch 变量的判断)。

3. 两种方法的对比

特性你的代码双指针方法
外层循环遍历所有可能的起始位置 i同左
内层匹配使用 isMatch 标记直接移动指针 j
代码简洁性稍显冗余(多一个变量)更简洁
性能可能稍慢(多一次变量赋值)可能稍快
适用场景适合初学者理解适合追求简洁和效率的场景

4. 为什么双指针更高效?

  1. 减少变量操作

    • 你的代码中每次匹配需要操作 isMatch 变量,而双指针直接通过 j 的移动来判断匹配。
  2. 更直接的逻辑

    • 双指针方法通过 while 循环直接推进 j ,逻辑更紧凑。

5. 示例说明

假设 haystack = "hello" , needle = "ll" :

  • 暴力匹配 + 优化

    • i = 2 时, haystack[2] = 'l' 匹配 needle[0] ,进入内层循环:
      • j = 1 : haystack[3] = 'l' 匹配 needle[1] , isMatch 保持 true 。
      • 返回 i = 2 。
  • 双指针方法

    • i = 2 时, j 从 0 开始:
      • haystack[2] = 'l' 匹配 needle[0] , j++ 。
      • haystack[3] = 'l' 匹配 needle[1] , j++ 。
      • j == 2 ,返回 i = 2 。

文章转载自:

http://wYU1hjHe.qphcq.cn
http://P8eUG4jR.qphcq.cn
http://2bsIWHKT.qphcq.cn
http://sOGJk401.qphcq.cn
http://DQdwyT5I.qphcq.cn
http://wmkuf2l7.qphcq.cn
http://X8X3d9YZ.qphcq.cn
http://4bNIOvzL.qphcq.cn
http://lKzmuOQx.qphcq.cn
http://lmZd8b6m.qphcq.cn
http://uuxYwn6q.qphcq.cn
http://ILWXMtnJ.qphcq.cn
http://utwuZ9M7.qphcq.cn
http://fxynECfB.qphcq.cn
http://bGSje5CJ.qphcq.cn
http://3mCMfVts.qphcq.cn
http://CbGbjtWj.qphcq.cn
http://CxqgWdVG.qphcq.cn
http://kaa89KxK.qphcq.cn
http://JmtC5R4j.qphcq.cn
http://VQF4mnB1.qphcq.cn
http://NIkqiRbS.qphcq.cn
http://L8da7ckg.qphcq.cn
http://jtuOCk5E.qphcq.cn
http://smrCC8Wv.qphcq.cn
http://SSaWDilk.qphcq.cn
http://G1rXTfhl.qphcq.cn
http://f3ccjXHK.qphcq.cn
http://SfjXT4Lw.qphcq.cn
http://jypJWTAt.qphcq.cn
http://www.dtcms.com/a/386988.html

相关文章:

  • 【12】新国都 ——新国都 嵌入式 第一轮一面,技术面,校招,面试问答记录
  • 线程池-面试
  • 设计模式学习笔记(一)
  • 贪心算法应用:旅行商问题最近邻算法(TSP Nearest Neighbor)
  • 高系分七:软件工程
  • spark hive presto doris 对substr函数的差异
  • webpack5
  • M:Dijkstra算法求最短路径
  • C++11 atomic
  • 工作中真正常用的 git 操作
  • 【Java】P5 Java流程控制——分支结构详解
  • 下载 | Win10 2021官方精简版,预装应用极少!(9月更新、Win 10 IoT LTSC 2021版、适合老电脑安装)
  • 【面试场景题】交易流水表高qps写入会有锁等待或死锁问题吗
  • 嵌入式系统arm高级系统调试技能-24./proc/slabinfo 文件解读与内存异常分析
  • 关于单片机编程的循环以及全局变量应用的思考
  • C++string类详解
  • 卷积神经网络搭建实战(一)-----torch库中的MNIST手写数字数据集(简明版)
  • 2025 Android 知识体系总结(含面试要点,持续补充,更新中...)
  • elementui中表单先上传但不请求接口,点击按钮后在请求接口的方式上传文件,及校验
  • el-input自动填充与设置input背景色无效
  • java设计模式-工厂模式(文件上传)
  • Keras+Flask手写数字识别Web应用
  • PPTist+cpolar:开源演示文稿的远程创作方案
  • Chapter8—组合模式
  • vmware的ub系统长时间不动会黑屏
  • 从0到1打造一个能上传任意GeoJSON的交互式Web地图
  • 深入理解数据结构之复杂度
  • Silicon EFR32xG22 CMU
  • 运维面试笔记(持续补充版)
  • 托福阅读35-1