前言

本题是经典的字符串单模匹配的模型,因此可以使用字符串匹配算法解决,常见的字符串匹配算法包括暴力匹配、Knuth-Morris-Pratt 算法、Boyer-Moore 算法、Sunday 算法等,本文 ## 前言

本题是经典的字符串单模匹配的模型,因此可以使用字符串匹配算法解决,常见的字符串匹配算法包括暴力匹配、Knuth-Morris-Pratt 算法、Boyer-Moore 算法、Sunday 算法等,本文将讲解朴素解法(暴力匹配)和KMP算法

因为哈希方法可能出现哈希值相等但是字符串不相等的情况,而 strStr 函数要求匹配结果必定正确,因此本文不介绍哈希方法,有兴趣的读者可以自行了解滚动哈希的实现(如 Rabin-Karp 算法)。

方法一:暴力匹配

思路及算法

我们可以让字符串 needle 与字符串haystack 的所有长度为 mm 的子串均匹配一次。

为了减少不必要的匹配,我们每次匹配失败即立刻停止当前子串的匹配,对下一个子串继续匹配。如果当前子串匹配成功,我们返回当前子串的开始位置即可。如果所有子串都匹配失败,则返回 −1。

代码

class Solution {public int strStr(String haystack, String needle) {int n = haystack.length(), m = needle.length();for (int i = 0; i + m <= n; i++) {boolean flag = true;for (int j = 0; j < m; j++) {if (haystack.charAt(i + j) != needle.charAt(j)) {flag = false;break;}}if (flag) {return i;}}return -1;}
}

复杂度分析

  • 时间复杂度:O(n×m),其中n 是字符串haystack 的长度,m 是字符串needle 的长度。最坏情况下我们需要将字符串needle 与字符串haystack 的所有长度为 mm 的子串均匹配一次。
  • 空间复杂度:O(1)。我们只需要常数的空间保存若干变量。

KMP 解法

讲解转自:三叶姐

KMP 算法是一个快速查找匹配串的算法,它的作用其实就是本题问题:如何快速在「原字符串」中找到「匹配字符串」。

上述的朴素解法,不考虑剪枝的话复杂度是 O(m∗n) 的,而 KMP 算法的复杂度为O(m+n)。

KMP 之所以能够在 O(m+n) 复杂度内完成查找,是因为其能在「非完全匹配」的过程中提取到有效信息进行复用,以减少「重复匹配」的消耗。

你可能不太理解,没关系,我们可以通过举

leetcode 028.实现strStr(),即查找重复字符串(KMP算法)相关推荐

  1. 查找子字符串----KMP算法深入剖析

    假设主串:a b a b c a b c a c b a b       子串:a b c a c 1.一般匹配算法 逐个字符的比较,匹配过程如下: 第一趟匹配 a b a b c a b c a c ...

  2. java找重复字符串_在java中怎样查找重复字符串

    在一段java编程代码中,字符串是不可缺少的一个要素,属于java中的基础知识,字符串不仅在java面试题中会出现,在编写代码时更要掌握怎样使用字符串.在前面我们也学习过关于字符串截取的知识,你应该有 ...

  3. Java实现 LeetCode 609 在系统中查找重复文件(阅读理解+暴力大法)

    609. 在系统中查找重复文件 给定一个目录信息列表,包括目录路径,以及该目录中的所有包含内容的文件,您需要找到文件系统中的所有重复文件组的路径.一组重复的文件至少包括二个具有完全相同内容的文件. 输 ...

  4. 【亡羊补牢】挑战数据结构与算法 第18期 LeetCode 面试题 08.08. 有重复字符串的排列组合(递归与回溯)

    仰望星空的人,不应该被嘲笑 题目描述 有重复字符串的排列组合.编写一种方法,计算某字符串的所有排列组合. 示例1: 输入:S = "qqe"输出:["eqq", ...

  5. leetcode面试题 08.08. 有重复字符串的排列组合(回溯)

    有重复字符串的排列组合.编写一种方法,计算某字符串的所有排列组合. 示例1: 输入:S = "qqe" 输出:["eqq","qeq",&q ...

  6. 459. 重复的子字符串-KMP算法

    459. 重复的子字符串 给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成. 示例 1: 输入: s = "abab" 输出: true 解释: 可由子串 & ...

  7. python实现Trie 树+朴素匹配字符串+RK算法匹配字符串+kmp算法匹配字符串

    一.trie树应用: 相应leetcode 常用于搜索提示,如当输入一个网址,可以自动搜索出可能的选择.当没有完全匹配的搜索结果,可以返回前缀最相似的可能. 例如三个单词app, apple, add ...

  8. 字符串 kmp算法解析

    kmp算法是用于解析字符串匹配的问题.给定两个字符串:第一个是文本串str,第二个是匹配串p.问str中最早有那个位置能完全和匹配串p匹配呢? 1. 暴力匹配 假设文本串的长度为n,匹配串的长度为m. ...

  9. LeetCode 609. 在系统中查找重复文件(哈希)

    1. 题目 给定一个目录信息列表,包括目录路径,以及该目录中的所有包含内容的文件,您需要找到文件系统中的所有重复文件组的路径. 一组重复的文件至少包括二个具有完全相同内容的文件. 输入列表中的单个目录 ...

最新文章

  1. 利用牛顿法求平方根-Go语言实现
  2. 如何在Colab上实现近200万图片的精准检索匹配?
  3. 初识C语言---(2)
  4. Linux 操作系统原理 — 内存 — Cache 和 Buffer
  5. 3d人脸重建 facescape 测试
  6. 【组合数学】递推方程 ( 递推方程示例 1 | 列出递推方程 )
  7. php的cookie教程,PHP4之COOKIE支持详解
  8. 双谷人才财务管理(序)
  9. P3960-列队【权值线段树】
  10. jsbridge原理_React Hooks 原理与最佳实践
  11. typescript语法高亮插件_vscode常用插件
  12. Spring MVC 3.0 返回JSON数据的方法
  13. @程序员,盘一盘炼成高效能开发者的 14 个习惯!
  14. 部署mysql主从同步
  15. 制作Linux的优盘启动盘
  16. bzoj 1624: [Usaco2008 Open] Clear And Present Danger 寻宝之路(floyd)
  17. 2021音视频技术大会北京站开幕
  18. Anaconda下载安装教程
  19. 传统BIOS下的USB启动设置
  20. PS如何制作炫酷的字体,有什么好的教程吗

热门文章

  1. 题解 Sticks 小木棍
  2. android qq空间效果,更新UI设计 Android手机QQ空间1.2详测
  3. IT行业新秀SRE都是做什么的
  4. 数独游戏-蓝桥杯-C语言,数独游戏_java_深搜+回溯
  5. 红黑树(Red Black Tree)的简单理解
  6. lepad k1 android 4,软硬齐升级 安卓3.1版联想乐Pad K1评测(7)
  7. 2022大一作业日历显示
  8. 阿里云盘window客户端开发
  9. 2023年实习生应聘面经
  10. 通过一趟遍历找出长度为n的单链表中值最大的节点.【数据结构】【单链表】