字符串查找是经典场景,也是面试中最常见的一道题。

说来惭愧,毕业3年了,才明白了kmp算法的实现,以前一直以为这类算法是基础,工作中中不会碰到【也的确没有碰到过。。。】

但是,对这些基本算法结构的理解是做一个工程师最基本的技能,好好学习,天天向上,在年前项目停止打酱油的日子里,敲了个bf和kmp的实现

#include <stdio.h>
#include <stdlib.h>
#include <string.h> int bf(char *s, char* p) {
int i, j;
int lens,lenp;
if(NULL == s || NULL == p) {
return -1;
}
lens = strlen(s);
lenp = strlen(p);
for(i = 0; i < lens; i++) {
j = 0;
while(s[i] == p[j] && j < lenp) {
i ++;
j ++;
}
if(j == lenp) {
return i - lenp;
}
i = i - j + 1;
}
return -1;
} int main() {
int ret;
char s[] = "abcdhelloadf";
char p[] = "hello";
ret = bf(s, p);
printf("%d", ret);
return 0;
}

  

#include <stdio.h>
#include <stdlib.h>
#include <string.h> #define MAXN 100 char s[MAXN] = "ababaababcaba";
char p[MAXN] = "ababc";
int next[MAXN]; int kmp(char *s, char *p) {
int i, j;
int lens, lenp;
if( NULL == s || NULL == p) {
return -1;
}
lens = strlen(s);
lenp = strlen(p);
for(i = 0; i < lens; i++) {
j = 0;
while(s[i] == p[j] && j < lenp) {
i ++;
j ++;
}
if( j == lenp) {
return i - j;
}
if(next[j] != -1){
j = next[j];
}
else {
j = 0;
i ++;
}
}
return -1;
} void get_next(char *p, int *next) {
int i, j;
int len;
int tmp;
len = strlen(p);
for(i = 0; i < len; i++) {
if(i == 0) {
next[i] = -1;
}
else if(i == 1) {
next[i] = 0;
}
else {
tmp = i - 1;
for(j = tmp; j >= 0; j--) {
if(equal(p, i, j)) {
next[i] = j;
break;
}
}
}
}
} int equal(char *p, int i, int j) {
int tmpi;
for(tmpi = 0; tmpi < j; tmpi++) {
if(p[tmpi] != p[i, i - j + tmpi]) {
return 0;
}
}
return 1;
} int main() {
int lenp;
int ret;
get_next(p, next);
ret = kmp(s, p);
printf("%d\n", ret); return 0;
}

  

[算法] kmp实现的更多相关文章

  1. [每天默写一个算法]KMP

    [每天默写一个算法]KMP 作业要求:默写String的KMP算法. KMP是经典的字符串匹配算法.复杂度为O(n+m) public static class StringKMP { /// < ...

  2. 数据结构与算法--KMP算法查找子字符串

    数据结构与算法--KMP算法查找子字符串 部分内容和图片来自这三篇文章: 这篇文章.这篇文章.还有这篇他们写得非常棒.结合他们的解释和自己的理解,完成了本文. 上一节介绍了暴力法查找子字符串,同时也发 ...

  3. 经典算法 KMP算法详解

    内容: 1.问题引入 2.暴力求解方法 3.优化方法 4.KMP算法 1.问题引入 原始问题: 对于一个字符串 str (长度为N)和另一个字符串 match (长度为M),如果 match 是 st ...

  4. 笔记-算法-KMP算法

    笔记-算法-KMP算法 1.      KMP算法 KMP算法是一种改进的字符串匹配算法,KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的.具体实现就是实现一 ...

  5. 值得花费一周研究的算法 -- KMP算法(indexOf)

    KMP算法是由三个科学家(kmp分别是他们名字的首字母)创造出来的一种字符串匹配算法. 所解决的问题: 求文本字符串text内寻找第一次出现字符串s的下标,若未出现返回-1. 例如 text : &q ...

  6. 算法-KMP串匹配

    字符串匹配 http://www.cnblogs.com/jingmoxukong/p/4343770.html 模式匹配是数据结构中字符串的一种基本运算,给定一个子串,要求在某个字符串中找出与该子串 ...

  7. [C++] [算法] KMP算法

    KMP串匹配算法是一个经典的算法. 传统BF算法是传统的字符串匹配算法.很好理解.叶实现.但时间复杂度太高. 本文将从字符串模式字符串被称为.为了匹配字符串被称为主弦. KMP配时能够少移动从串的位置 ...

  8. 程序员必会算法-KMP算法

    KMP算法是一种优秀的字符串匹配算法,字符串匹配的常规算法是一步一步进行移位和比较操作,直至找到完全相匹配的字符串. 下面通过一个例子,为大家仔细说明KMP算法的使用和思路: 问题: 在字符串“DEA ...

  9. 算法 kmp算法

    kmp算法是改进后的字符匹配算法,它与bf算法的区别是,每次从串与主串匹配失败后,从串与主串匹配的位置不同. 下面具体说下这两种算法的区别: 主串:BABCDABABCDABCED 从串:ABCDAB ...

随机推荐

  1. MySQL-测试卷一

    MySQL-测试卷一 一.单项选择题 1 下面不属于Msql数据库特点的是(  ) A. 免费使用  B.不能跨平台  C.开源软件  D.功能强大 2 定义表的一个字段, 要求能表示4位整数,2位小 ...

  2. Rsync数据远程同步备份

    rsync的使用方法 一.设置Rsync Server端 Rsync server需要设定四个方面: 1.规划建立备份目录区 2.设定: /etc/xinetd.d/rsync 3.设定: /etc/ ...

  3. makesfx.exe (Make SFX (Self-extracting archive))

    来源: http://www.cr173.com/soft/5500.html http://74.cz/en/make-sfx/ 官方,最新 Make SFX 是一套Win32平台下能让您制作自解压 ...

  4. Qt学习

    博客 一去丶二三里的博客 http://blog.sina.com.cn/s/articlelist_2801495241_0_4.html

  5. //获取url中"?"符后的字串

    //获取url中"?"符后的字串 function getParamByUrl(url) {    var theRequest = new Object();    var in ...

  6. [转]Java初始化顺序总结 - 静态变量、静态代码块、成员变量、构造函数

    Java初始化顺序1在new B一个实例时首先要进行类的装载.(类只有在使用New调用创建的时候才会被java类装载器装入)2,在装载类时,先装载父类A,再装载子类B3,装载父类A后,完成静态动作(包 ...

  7. C# Socket的TCP通讯 异步 (2015-11-07 10:07:19)转载▼

    异步 相对于同步,异步中的连接,接收和发送数据的方法都不一样,都有一个回调函数,就是即使不能连接或者接收不到数据,程序还是会一直执行下去,如果连接上了或者接到数据,程序会回到这个回调函数的地方重新往下 ...

  8. ffmpeg合并多个视频

    实例1: 把4个视频(1.f4v, 2.f4v, 3.f4v, 4.f4v)合并成一个文件(out.mp4) 基本无损,而且速度飞快! #-vcodec copy -acodec copy   == ...

  9. PAT (Advanced Level) 1100. Mars Numbers (20)

    简单题. #include<cstdio> #include<cstring> #include<cmath> #include<vector> #in ...

  10. hdu_5711_Ingress(TSP+贪心)

    题目连接:hdu5711 这题是 HDU 女生赛最后一题,TSP+贪心,确实不好想,看了wkc巨巨的题解,然后再做的 题解传送门:Ingress #include<cstdio> #inc ...