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

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

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

文章目录

  • 思路
  • 解题方法
  • 复杂度
  • Code

思路

这个问题可以通过使用KMP(Knuth-Morris-Pratt)算法来解决。KMP算法是一种改进的字符串匹配算法,它的主要思想是当子串与目标字符串不匹配时,能知道一部分已经匹配的字符,利用这些信息避免从目标字符串的头部再去做匹配。

解题方法

KMP算法首先会预处理子串,生成一个名为next的数组,用于存储子串的最长公共前后缀的长度。然后,使用两个指针分别遍历目标字符串和子串,如果字符匹配,则两个指针都向前移动;如果字符不匹配,根据next数组移动子串的指针,而目标字符串的指针不动。如果子串的指针移动到了子串的末尾,那么就找到了一个匹配的子串。

复杂度

时间复杂度:

O ( n + m ) O(n+m) O(n+m),其中 n n n是目标字符串的长度, m m m是子串的长度。预处理子串的时间复杂度是 O ( m ) O(m) O(m),匹配的时间复杂度是 O ( n ) O(n) O(n)

空间复杂度:

O ( m ) O(m) O(m),需要额外的空间来存储 n e x t next next数组。

Code

class Solution {public int strStr(String s1, String s2) {return kmp(s1.toCharArray(), s2.toCharArray());}public int kmp(char[] s1, char[] s2) {int n = s1.length;int m = s2.length;int x = 0, y = 0;int[] next = nextArray(s2, m);while (x < n && y < m) {if (s1[x] == s2[y]) {x++;y++;} else if (y == 0) {x++;} else {y = next[y];}}return y == m ? x - y : -1;}public int[] nextArray(char[] s, int m) {if(m == 1) {return new int[]{-1};}int[] next = new int[m];next[0] = -1;next[1] = 0;int i = 2, cn = 0;while(i < m) {if(s[i - 1] == s[cn]) {next[i++] = ++cn;} else if(cn > 0) {cn = next[cn];} else {next[i++] = 0;}}return next;}
}
http://www.lryc.cn/news/300615.html

相关文章:

  • 宿舍|学生宿舍管理小程序|基于微信小程序的学生宿舍管理系统设计与实现(源码+数据库+文档)
  • CVE-2022-25487 漏洞复现
  • C#面:强类型和弱类型
  • nodejs和npm和vite
  • 相机图像质量研究(24)常见问题总结:CMOS期间对成像的影响--摩尔纹
  • Redis -- 数据库管理
  • 蓝桥杯(Web大学组)2023省赛真题:视频弹幕
  • 真假难辨 - Sora(OpenAI)/世界模拟器的技术报告
  • Linux第52步_移植ST公司的linux内核第4步_关闭内核模块验证和log信息时间戳_编译_并通过tftp下载测试
  • ctfshow-web21~28-WP
  • 鸿蒙开发系列教程(二十四)--List 列表操作(3)
  • 线性代数笔记2--矩阵消元
  • 透光力之珠——光耦固态继电器的独特特点解析
  • C#系列-​​​​​​​EntityFrameworkCore.Transactions.Abstractions应用场景+实例(38)
  • PMDG 737
  • 深入探索Midjourney:领航人工智能的新征程
  • ChatGPT高效提问—prompt实践(漏洞风险分析-重构建议-识别内存泄漏)
  • 【AIGC】Stable Diffusion 的提示词入门
  • 力扣---通配符匹配
  • Rust 原生类型
  • 09、全文检索 -- Solr -- SpringBoot 整合 Spring Data Solr (生成DAO组件 和 实现自定义查询方法)
  • C# CAD SelectionFilter下TypedValue数组
  • python 爬虫篇(3)---->Beautiful Soup 网页解析库的使用(包含实例代码)
  • 第十二周学习报告
  • Redis面试题整理(持续更新)
  • 一周学会Django5 Python Web开发-Django5 Hello World编写
  • 讲解用Python处理Excel表格
  • WEB APIs(1)
  • C++重新入门-基本输入输出
  • 【C语言】解析刘谦春晚魔术《守岁共此时》