[算法] kmp实现
字符串查找是经典场景,也是面试中最常见的一道题。
说来惭愧,毕业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; }
喜欢一起简单,实用的东西,拒绝复杂花哨,我不是GEEK.