leetcode 028.实现strStr(),即查找重复字符串(KMP算法)
前言
本题是经典的字符串单模匹配的模型,因此可以使用字符串匹配算法解决,常见的字符串匹配算法包括暴力匹配、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算法)相关推荐
- 查找子字符串----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 ...
- java找重复字符串_在java中怎样查找重复字符串
在一段java编程代码中,字符串是不可缺少的一个要素,属于java中的基础知识,字符串不仅在java面试题中会出现,在编写代码时更要掌握怎样使用字符串.在前面我们也学习过关于字符串截取的知识,你应该有 ...
- Java实现 LeetCode 609 在系统中查找重复文件(阅读理解+暴力大法)
609. 在系统中查找重复文件 给定一个目录信息列表,包括目录路径,以及该目录中的所有包含内容的文件,您需要找到文件系统中的所有重复文件组的路径.一组重复的文件至少包括二个具有完全相同内容的文件. 输 ...
- 【亡羊补牢】挑战数据结构与算法 第18期 LeetCode 面试题 08.08. 有重复字符串的排列组合(递归与回溯)
仰望星空的人,不应该被嘲笑 题目描述 有重复字符串的排列组合.编写一种方法,计算某字符串的所有排列组合. 示例1: 输入:S = "qqe"输出:["eqq", ...
- leetcode面试题 08.08. 有重复字符串的排列组合(回溯)
有重复字符串的排列组合.编写一种方法,计算某字符串的所有排列组合. 示例1: 输入:S = "qqe" 输出:["eqq","qeq",&q ...
- 459. 重复的子字符串-KMP算法
459. 重复的子字符串 给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成. 示例 1: 输入: s = "abab" 输出: true 解释: 可由子串 & ...
- python实现Trie 树+朴素匹配字符串+RK算法匹配字符串+kmp算法匹配字符串
一.trie树应用: 相应leetcode 常用于搜索提示,如当输入一个网址,可以自动搜索出可能的选择.当没有完全匹配的搜索结果,可以返回前缀最相似的可能. 例如三个单词app, apple, add ...
- 字符串 kmp算法解析
kmp算法是用于解析字符串匹配的问题.给定两个字符串:第一个是文本串str,第二个是匹配串p.问str中最早有那个位置能完全和匹配串p匹配呢? 1. 暴力匹配 假设文本串的长度为n,匹配串的长度为m. ...
- LeetCode 609. 在系统中查找重复文件(哈希)
1. 题目 给定一个目录信息列表,包括目录路径,以及该目录中的所有包含内容的文件,您需要找到文件系统中的所有重复文件组的路径. 一组重复的文件至少包括二个具有完全相同内容的文件. 输入列表中的单个目录 ...
最新文章
- 利用牛顿法求平方根-Go语言实现
- 如何在Colab上实现近200万图片的精准检索匹配?
- 初识C语言---(2)
- Linux 操作系统原理 — 内存 — Cache 和 Buffer
- 3d人脸重建 facescape 测试
- 【组合数学】递推方程 ( 递推方程示例 1 | 列出递推方程 )
- php的cookie教程,PHP4之COOKIE支持详解
- 双谷人才财务管理(序)
- P3960-列队【权值线段树】
- jsbridge原理_React Hooks 原理与最佳实践
- typescript语法高亮插件_vscode常用插件
- Spring MVC 3.0 返回JSON数据的方法
- @程序员,盘一盘炼成高效能开发者的 14 个习惯!
- 部署mysql主从同步
- 制作Linux的优盘启动盘
- bzoj 1624: [Usaco2008 Open] Clear And Present Danger 寻宝之路(floyd)
- 2021音视频技术大会北京站开幕
- Anaconda下载安装教程
- 传统BIOS下的USB启动设置
- PS如何制作炫酷的字体,有什么好的教程吗
热门文章
- 题解 Sticks 小木棍
- android qq空间效果,更新UI设计 Android手机QQ空间1.2详测
- IT行业新秀SRE都是做什么的
- 数独游戏-蓝桥杯-C语言,数独游戏_java_深搜+回溯
- 红黑树(Red Black Tree)的简单理解
- lepad k1 android 4,软硬齐升级 安卓3.1版联想乐Pad K1评测(7)
- 2022大一作业日历显示
- 阿里云盘window客户端开发
- 2023年实习生应聘面经
- 通过一趟遍历找出长度为n的单链表中值最大的节点.【数据结构】【单链表】