大哥可以写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算法
#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 ...
- 【KMP】【最小表示法】NCPC 2014 H clock pictures
题目链接: http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1794 题目大意: 两个无刻度的钟面,每个上面有N根针(N<=200000),每个 ...
- KMP算法&next数组总结
http://www.cnblogs.com/yjiyjige/p/3263858.html KMP算法应该是每一本<数据结构>书都会讲的,算是知名度最高的算法之一了,但很可惜,我大二那年 ...
随机推荐
- Linux目录文件详解FHS标准(2013.09.05)
Linux 目录配置的依据FHS(Filesystem Hierarchy Standard)标准,将目录分成为四种交互作用的形态: 四种形态的具体解释: 可分享的:可以分享给其他系统挂载使用的目录, ...
- poj3278(bfs)
题目链接:http://poj.org/problem?id=3278 分析:广搜,每次三种情况枚举一下,太水不多说了. #include <cstdio> #include <cs ...
- hdu4004(二分)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4004 大致题意 二分最大跳跃能力,判断是否可以在m次内到达对岸! 分析:由于求青蛙最小弹跳能力,所以二 ...
- ios多线程操作(五)—— GCD串行队列与并发队列
GCD的队列能够分为2大类型,分别为串行队列和并发队列 串行队列(Serial Dispatch Queue): 一次仅仅调度一个任务,队列中的任务一个接着一个地运行( ...
- NOJ1184 失落的邮票 哈希表
意甲冠军 我们共收集N邮票.现在失去了2张,剩下N-2张-..原集邮收集了所有对.因此,找到什么两枚邮票是一个.它们输出. (确定缺少邮票是不一样的) 思路 由于编号比較大,能够用hash表压缩成数组 ...
- Codeforces Round #277.5 (Div. 2)B——BerSU Ball
B. BerSU Ball time limit per test 1 second memory limit per test 256 megabytes input standard input ...
- Vsphere client 无法登陆VCenter 处理的方法
上周做安全的时候将DC.DB和VCenter 三台机器的防火墙都启用了,结果Vcenter 登陆的时候总是提示服务器没有响应,连web client 都无法登陆. 处理过程 一.首先要保证 vmvar ...
- Effective C++ 条款24
若全部參数皆需类型转换,请为此採用non-member函数 我们直奔主题 假设你定义一个有理数类例如以下 class Rational{ public: Rational(int numerator= ...
- 【Android UI】案例03滑动切换效果的实现(ViewPager)
本例使用ViewPager实现滑动切换的效果.本例涉及的ViewPager.为android.support.v4.view.ViewPager.所以须要在android项目中导入android-su ...
- UVA 11324 - The Largest Clique(强连通分量+缩点)
UVA 11324 - The Largest Clique 题目链接 题意:给定一个有向图,要求找一个集合,使得集合内随意两点(u, v)要么u能到v,要么v能到u,问最大能选几个点 思路:强连通分 ...