哥也能写KMP了——实现strstr()
经过上次去面试,面试官要求实现strstr(),当场就蒙了。这个题目是模式匹配问题,《算法导论》里列出了几种字符串匹配算法:
朴素算法 | Rabin-Karp | 有限自动机算法 | Knuth-Morris-Pratt (KMP)
各种方法都有自己的优缺点,我觉得,还有一些方法可以参考:
1)比如像求最长公共子串那样,用动态规划,最后判断最长公共子串的最大值是不是模式串的长度,不过,这有点绕。
2)用后缀数组,这个也有点绕,实现起来也有点麻烦,就不说了。
个人觉得,还是KMP好,KMP该怎么写呢,立马抄起书《数据结构(C语言版)》,看了一下,感觉,KMP实现起来,代码是很少的,效率还算可以了,实现的过程中,难就难在如何构造next[] 数组,以及如何理解next[],对避免指针无效回退的作用。看了一个上午,总算是明白了。现就贴下代码,做下笔记。
#include<iostream>
using namespace std; void get_next(const char* s, int* next){
int i = 0, j = -1;
next[0] = -1;
int len = strlen(s);
while(i < len){
if(j == -1 || s[i] == s[j]){
++i, ++j;
if(s[i] != s[j]) next[i] = j;
else next[i] = next[j];
}
else j = next[j];
}
}
int KMP_strstr(const char* s, const char* p){
int i = 0, j = 0;
int len_s = strlen(s), len_p = strlen(p);
int* next = new int[len_p];
get_next(s, next);
while(i < len_s && j < len_p){
if(j == -1 || s[i] == p[j])
++i, ++j;
else j = next[j];
}
delete []next;
if(j == len_p) return i - len_p;
else return -1;
}
int main(){
const int len = 6;
const char *s = "abaabc";
cout<<KMP_strstr("aaabbabaabcaad", s);
return 0;
}//output: 5
版权声明:本文为博主原创文章,未经博主允许不得转载。
哥也能写KMP了——实现strstr()的更多相关文章
- 大哥可以写KMP该——达到strstr()
在最后采访,面试官要求实现strstr(),当场就蒙了. 这个题目是模式匹配问题.<算法导论>里列出了几种字符串匹配算法: 朴素算法 | Rabin-Karp | 有限自己主动机算法 | ...
- 用KMP算法实现strStr()
strStr()函数的用途是在一个字符串S中寻找某个字串P第一次出现的位置.并返回其下标,找不到时返回-1.最简单的办法就是找出S全部的子串和P进行比較,然而这种方法比較低效.假设我们从S的下标0和P ...
- 真的有这么丝滑吗?近日国外一小哥深入研究了KMP算法……
近日被朋友问到了字符串匹配算法,让我想起了大二上学期在一次校级编程竞赛中我碰到同样的问题时,为自己写出了暴力匹配算法而沾沾自喜的经历. 现在想来,着实有点羞愧,于是埋头去学习了一下KMP算法,为了让自 ...
- 老哥你能写篇 SpringCloud Alibaba 全家桶吗? 看视频太累 太枯燥了 !
最喜欢的一句话: 1.01的365次方=37.78343433289 >>>1 0.99的365次方= 0.02551796445229, 每天进步一点点的目标,贵在坚持 前端时间有 ...
- 再写KMP算法
#include<iostream> #include<string> using namespace std; void getNext(char const*T,int l ...
- POJ3080 Blue Jeans —— 暴力枚举 + KMP / strstr()
题目链接:https://vjudge.net/problem/POJ-3080 Blue Jeans Time Limit: 1000MS Memory Limit: 65536K Total ...
- (原创)详解KMP算法
KMP算法应该是每一本<数据结构>书都会讲的,算是知名度最高的算法之一了,但很可惜,我大二那年压根就没看懂过~~~ 之后也在很多地方也都经常看到讲解KMP算法的文章,看久了好像也知道是怎么 ...
- BZOJ-3670 动物园 KMP+奇怪的东西
YveH爷再刷KMP,DCrusher看他刷KMP,跟着两个人一块刷KMP... 3670: [Noi2014]动物园 Time Limit: 10 Sec Memory Limit: 512 MB ...
- 详解KMP算法
转载注明出处:http://www.cnblogs.com/yjiyjige/p/3263858.html 什么是KMP算法: KMP是三位大牛:D.E.Knuth.J.H.Morris和V.R.Pr ...
随机推荐
- exec、eval
#!/usr/bin/env python3 # -*- coding: utf-8 -*- #info #warning def log(message): print('------------- ...
- TCP协议的一些问题
1 连接握手三次 解释1:已失效的连接请求报文段 情况下如下:client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server.本 ...
- Android 超仿Path时间轴和扇形菜单的效果
网上看到的 ,仅此记录一下,用到的时候便于查找 效果如下: 源码下载地址 : http://download.csdn.net/detail/abc13939746593/7251933
- 在stm32上移植wpa_supplicant(二)
第一层调用的移植和裁剪. wpa_supplicant_init 照论文的指示,删除wpa_params和wpa_global相关的东西.初始化流程也相当简单,driver初始化,eap_regist ...
- Vijos 1114 FBI树
描述 我们可以把由"0"和"1"组成的字符串分为三类:全"0"串称为B串,全"1"串称为I串,既含"0&quo ...
- POJ 2549 Sumsets
Sumsets Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10593 Accepted: 2890 Descript ...
- webdriver(python)学习笔记六——操作测试对象
定位到具体对象后,就需要对其进行操作,比如点击.输入内容等. 一般来说,webdriver中比较常用的操作对象的方法有下面几个 click 点击对象 send_keys 在对象上模拟按键输入 clea ...
- HDU 3853-loop(概率dp入门)
题意: r*c个方格,从(1,1)开始在每个方格可释放魔法(消耗能量2)以知,释放魔法后可能在原地.可能到达相邻的下面格子或右面格子,给出三者的概率 求要到达(R,C)格子,要消耗能量的期望值. 分析 ...
- 仿酷狗音乐播放器开发日志二十七 用ole为窗体增加文件拖动功能(附源码)
转载请说明原出处,谢谢~~ 中秋到了,出去玩了几天.今天把仿酷狗程序做了收尾,已经开发完成了,下一篇博客把完结的情况说一下.在这篇博客里说一下使用OLE为窗体增加文件拖拽的功能.使用播放器,我更喜欢直 ...
- 解决虚拟机ssh连接出错connection refused
在安装操作系统之后,使用ssh连接,发现直接报错connection refused. 检查虚拟机的连接方式,在使用host only的方式的时候,必须接入网线,不然的网卡是不活动的,从而不能使用ss ...