【每天一题】LeetCode 0028. 字符串匹配
开源地址: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.
解题思路
- 最简单的方法就是暴力匹配了,这里不做叙述了
- 经典的解法就是 KMP 算法进行匹配,KMP 算法的核心部分
是计算最大公共前后缀,产生 next 数组
换一种思路理解这个数组,该数组其实是指示模板字符串中
拥有的最大相同子字符串模板,这样就可以直接跳过那些不存在
相同模板的子字符串,从而加速模板迁移的速度,而不需要像
暴力匹配法那样,每一次失败都需要重头开始匹配,这就是
KMP 算法速度比较快的原因,其算法复杂度为 O(M+N) - 还一些与 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. 字符串匹配的更多相关文章
- LeetCode.942-DI字符串匹配(DI String Match)
这是悦乐书的第361次更新,第388篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第223题(顺位题号是942).给定仅包含I(增加)或D(减少)的字符串S,令N = S ...
- 【LeetCode】字符串匹配
给定目标串 haystack 和模式串 needle ,返回 needle 在 haystack 中第一次出现的位置下标,若 needle 不是 haystack 的子串则返回 -1. 1. Brut ...
- codeM编程大赛E题 (暴力+字符串匹配(kmp))
题目大意:S(n,k)用k(2-16)进制表示1-n的数字所组成的字符串,例如S(16,16)=123456789ABCDEF10: 解题思路: n最大50000,k最大100000,以为暴力会超时. ...
- leetcode笔记 动态规划在字符串匹配中的应用
目录 leetcode笔记 动态规划在字符串匹配中的应用 0 参考文献 1. [10. Regular Expression Matching] 1.1 题目 1.2 思路 && 解题 ...
- 滑动窗口通用解leetcode字符串匹配问题
滑动窗口,这玩意解决一些字符串匹配的题目是真的挺好用的,虽然本质还是双指针. 思路: 1.维护一个窗口,不断的向右边移动 2.满足要求后,移动左边,当不满足时,跳出. 3.重复1,2.得出答案. 下面 ...
- zstu.4194: 字符串匹配(kmp入门题&& 心得)
4194: 字符串匹配 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 206 Solved: 78 Description 给你两个字符串A,B,请 ...
- LeetCode 44 Wildcard Matching(字符串匹配问题)
题目链接:https://leetcode.com/problems/wildcard-matching/?tab=Description '?' Matches any single chara ...
- LeetCode 10 Regular Expression Matching(字符串匹配)
题目链接 https://leetcode.com/problems/regular-expression-matching/?tab=Description '.' Matches any si ...
- 2018 ACM-ICPC 中国大学生程序设计竞赛线上赛 H题 Rock Paper Scissors Lizard Spock.(FFT字符串匹配)
2018 ACM-ICPC 中国大学生程序设计竞赛线上赛:https://www.jisuanke.com/contest/1227 题目链接:https://nanti.jisuanke.com/t ...
随机推荐
- netty的调优-及-献上写过注释的源码工程
Netty能干什么? Http服务器 使用Netty可以编写一个 Http服务器, 就像tomcat那样,能接受用户发送的http请求, , 只不过没有实现Servelt规范, 但是它也能解析携带的参 ...
- ThinkPHP5——Session和Cookie
Session 首先要引入use think\Session:下面使用静态方法调用Session //赋值 Session::set('name','s1'); //赋值think作用域,set(‘名 ...
- 微信小程序——e.target与e.currentTarget的区别
在小程序的点击事件中,我们经常使用这两个属性来传参,看起来效果一样,查了官方文档如下: target:事件源组件对象 currentTarget:当前组件对象 什么意思?我刚开始就有点不懂,那就直接上 ...
- sar命令,linux中最为全面的性能分析工具之一
sar是System Activity Reporter(系统活动情况报告)的缩写.这个工具所需要的负载很小,也是目前linux中最为全面的性能分析工具之一.此款工具将对系统当前的状态就行取样,然后通 ...
- Nginx 404 Not Found 解决办法
环境:宝塔Nginx面板 解决办法: 宝塔面板--站点设置-配置文件. 去掉: error_page 404 /404.html; 前面的 # 号.
- 开发中遇到的一些bug及解决方案
一.在使用UIStackView时报“UIStackView before iOS 9.0”.
- solr集群与项目实战
什么是 SolrCloud : SolrCloud(solr 云)是 Solr 提供的分布式搜索方案,当你需要大规模,容错,分布式索引和检索能力时使用 SolrCloud.当一个系统的索引数据量少的时 ...
- OA项目之mybatis动态查询
类似于三个条件,可以全部选择,也可以选择几个条件进行查询 Mapper.xml文件: <resultMap type="Employee" id="selAll&q ...
- CoderForces Round526 (A~E)题解
A. The Fair Nut and Elevator time limit per test 1 second memory limit per test 256 megabytes input ...
- Python基础第一课
Python基础 安装软件并配置环境变量 1.第一句python --初学后缀名可以是任何数 --后期学习需要导入模块时不是py后缀名会报错 2.两种执行方式 Python解释器 py文件路径 Pyt ...