开源地址:https://github.com/jiauzhang/algorithms


题目描述

*  https://leetcode-cn.com/problems/implement-strstr
* 给定一个 haystack 字符串和一个 needle 字符串,
* 在 haystack 字符串中找出 needle 字符串出现的第一个位置(从0开始)。
* 如果不存在,则返回 -1。
*
* 示例 1:
* 输入: haystack = "hello", needle = "ll"
* 输出: 2
*
* 示例 2:
* 输入: haystack = "aaaaa", needle = "bba"
* 输出: -1
*
* 说明:
* 当 needle 是空字符串时,我们应当返回 1.

解题思路

  1. 最简单的方法就是暴力匹配了,这里不做叙述了
  2. 经典的解法就是 KMP 算法进行匹配,KMP 算法的核心部分

    是计算最大公共前后缀,产生 next 数组

    换一种思路理解这个数组,该数组其实是指示模板字符串中

    拥有的最大相同子字符串模板,这样就可以直接跳过那些不存在

    相同模板的子字符串,从而加速模板迁移的速度,而不需要像

    暴力匹配法那样,每一次失败都需要重头开始匹配,这就是

    KMP 算法速度比较快的原因,其算法复杂度为 O(M+N)
  3. 还一些与 KMP 算法类似的,比如 BM 算法、Sunday 算法等

示例代码

class Solution {
public:
int strStr(string haystack, string needle) {
if (!needle.size())
return 0; if (!haystack.size())
return -1; vector<int> next;
get_next(needle, next); int i = 0, j = 0;
/*
这里要格外注意,调试了很久才找到错误原因
必须对 string::size() 函数的返回值进行强制类型转换
*/
while (i < (int)haystack.size() && j < (int)needle.size()) {
if ((j == -1) || (haystack[i] == needle[j])) {
i++;
j++;
} else {
j = next[j];
}
} if (j == needle.size()) {
return i - j;
} else {
return -1;
}
} void get_next(string &tmpl, vector<int> &next) {
next.resize(tmpl.size());
next[0] = -1; int k = -1;
int j = 0;
while (j < next.size() - 1)
{
if (k == -1 || tmpl[j] == tmpl[k])
{
k++;
j++;
if (tmpl[j] != tmpl[k])
next[j] = k;
else
next[j] = next[k];
}
else
{
k = next[k];
}
}
}
};

【每天一题】LeetCode 0028. 字符串匹配的更多相关文章

  1. LeetCode.942-DI字符串匹配(DI String Match)

    这是悦乐书的第361次更新,第388篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第223题(顺位题号是942).给定仅包含I(增加)或D(减少)的字符串S,令N = S ...

  2. 【LeetCode】字符串匹配

    给定目标串 haystack 和模式串 needle ,返回 needle 在 haystack 中第一次出现的位置下标,若 needle 不是 haystack 的子串则返回 -1. 1. Brut ...

  3. codeM编程大赛E题 (暴力+字符串匹配(kmp))

    题目大意:S(n,k)用k(2-16)进制表示1-n的数字所组成的字符串,例如S(16,16)=123456789ABCDEF10: 解题思路: n最大50000,k最大100000,以为暴力会超时. ...

  4. leetcode笔记 动态规划在字符串匹配中的应用

    目录 leetcode笔记 动态规划在字符串匹配中的应用 0 参考文献 1. [10. Regular Expression Matching] 1.1 题目 1.2 思路 && 解题 ...

  5. 滑动窗口通用解leetcode字符串匹配问题

    滑动窗口,这玩意解决一些字符串匹配的题目是真的挺好用的,虽然本质还是双指针. 思路: 1.维护一个窗口,不断的向右边移动 2.满足要求后,移动左边,当不满足时,跳出. 3.重复1,2.得出答案. 下面 ...

  6. zstu.4194: 字符串匹配(kmp入门题&& 心得)

    4194: 字符串匹配 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 206  Solved: 78 Description 给你两个字符串A,B,请 ...

  7. LeetCode 44 Wildcard Matching(字符串匹配问题)

    题目链接:https://leetcode.com/problems/wildcard-matching/?tab=Description   '?' Matches any single chara ...

  8. LeetCode 10 Regular Expression Matching(字符串匹配)

    题目链接 https://leetcode.com/problems/regular-expression-matching/?tab=Description   '.' Matches any si ...

  9. 2018 ACM-ICPC 中国大学生程序设计竞赛线上赛 H题 Rock Paper Scissors Lizard Spock.(FFT字符串匹配)

    2018 ACM-ICPC 中国大学生程序设计竞赛线上赛:https://www.jisuanke.com/contest/1227 题目链接:https://nanti.jisuanke.com/t ...

随机推荐

  1. 2019-2020-1 20199304《Linux内核原理与分析》第三周作业

    1.操作系统是如何工作的? 计算机三个法宝(3个关键性的方法机制): 存储程序计算机.函数调用堆栈.中断机制. 1.1堆栈: 在计算机领域,堆栈是一个不容忽视的概念,堆栈是一种数据结构.堆栈都是一种数 ...

  2. 【开发者portal在线开发插件系列二】多条上下行消息(messageId的使用)【华为云技术分享】

    前言和基本操作请参考[开发者portal在线开发插件系列一]profile和基本上下行消息,此处不再复述,没操作过的小伙伴一定要先去看看哦~ 话不多说,开始今天的演(表)示(演) 场景说明: 假设一: ...

  3. CocoaPods 详解之----更新篇

    CocoaPods 大概是 2011 年出现的开源组件管理工具(目前已支持 Objective-C 和 Swift),近年来普及率越来越高,几乎已是所有 Cocoa 开源项目的标配.另外,很多大点的团 ...

  4. 基于leaflet的标绘功能(一)--可调整的圆

    标绘功能是指在电子地图上可以标注点.线.面.复杂多边形等图形.主要操作包括上图.调整(大小.方向.位置).网络存储等.根据具体的业务场景,也可以做到协同标绘等特色功能.其中,要求每个图形有若干关键点控 ...

  5. jenkins持续集成工作原理、功能、部署方式等介绍

    超详细的jenkins持续集成工作原理.功能.部署方式等介绍 原创 波波说运维 2019-08-29 00:01:00 概述 今天简单整理了一下jenkins的一些概念性内容,归纳如下: 1.概念 j ...

  6. Dubbo学习系列之七(分布式订单ID方案)

    既然选择,就注定风雨兼程! 开始吧! 准备:Idea201902/JDK11/ZK3.5.5/Gradle5.4.1/RabbitMQ3.7.13/Mysql8.0.11/Lombok0.26/Erl ...

  7. Mock接口依赖的使用

    mock 能做什么 1.前后端联调,如果你是一个前端页面开发,现在需要开发一个功能:下一个订单,支付页面的接口,根据支付结果,支付成功,展示支付成功页,支付失败,展示支付失败页.要完成此功能,你需要 ...

  8. Eclipse Properties编辑

    1.使用Eclipse插件编辑,这是本人推荐的方式 UPDATE地址:http://propedit.sourceforge.jp/eclipse/updates 2.使用JDK自带的工具native ...

  9. static介绍、内部类、final、权限修饰符的作用范围

    static 关键字:(可用于修饰方法.变量)     static 特点:         static是静态修饰符,一般修饰成员变量.被static修饰的属于全局共享.被static修饰的成员属于 ...

  10. Winform修改配置文件节点保存到配置文件

    主要使用: Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); ...