KMP算法
来源:互联网 发布:c语言打印一个三角形 编辑:程序博客网 时间:2024/06/07 06:50
题目:
经典的KMP算法
分析:
和KMP算法对应的是BF算法,其中BF算法时间复杂度,最坏情况下可以达到O(n*m),而KMP算法的时间复杂度是O(n + m),所以,KMP算法效率高很多。
但是KMP算法不太好理解,其中牵涉到next数组,目标就是让模式串尽可能的往右滑动,减少比较次数,比如
a b a b c
-1 0 0 1 2
比如我们比较ababc时,如果c比较发现错误,前面的abab已经比较成功,那么下次比较,我们只需要从aba的最后一个a开始比较,这样省去了从头开始比较。
算法代码:
#include <iostream>#include <cstdlib>#include <cstdio>using namespace std;//这是整个kmp中最核心的地方int get_next(const char*t, int *next){int i = 0;int j = -1;//设置j = -1,非常巧妙int len = strlen(t);memset(next,0, sizeof(int) * len);next[0] = -1;while(i < len - 1){if(j == -1 || t[i] == t[j])//前面的判断,j == -1, 非常巧妙{i++;j++;next[i] = j;//将后面的next数组元素赋值}elsej = next[j];}}int kmp(const char *s, const char *t){int i = 0;int j = 0;int next[100];get_next(t,next);while(i < strlen(s) && j < strlen(t)){if(j == - 1 || s[i] == t[j])//如果j为-1,或者模式串和主串相等,两者继续往下比较{i++;j++;}elsej = next[j];}if(j >= (int)strlen(t)){cout << "found " << endl;return 0;}cout << "not found" <<endl;return 0;}//暴力法int brute_force(const char *s, const char *t){int i, j;i = 0;while(i < strlen(s)){j = 0;while(j < strlen(t)){if(s[i] == t[j]){i++;j++;}else{i = i - j + 1;break;}}if(j == (int)strlen(t)){cout << "found" << endl;return 0;}}cout << "not found" << endl;return 0;}int main(){brute_force("abcdef", "abcdef");kmp("abcdef", "aaaa");return 0;}
总结:
KMP算法非常经典,同时这个算法实现很多地方非常巧妙。
- KMP算法详解 【KMP】
- 【KMP】KMP算法模板
- KMP hihoCoder1015 KMP算法
- kmp算法
- KMP算法
- KMP算法
- KMP算法
- KMP算法
- KMP 算法
- kmp算法
- KMP算法
- kmp算法
- KMP算法
- KMP算法
- kmp算法
- kmp算法
- KMP算法
- KMP算法
- 正则表达式
- Beej网络socket编程指南
- php解密
- DotNet软件开发框架
- 如何“打败”CAP定理
- KMP算法
- 2012下半年版无忧全国计算机等级考试超级模拟软件DVD合集三级PC技术部分上机练习第33套题汇编运行结果
- if语句的安全模式
- dddddd
- 回调函数详解
- java类的初始化顺序
- 学会使用Git
- TCP三次握手及四次挥手详细图解
- C#使用默认浏览器打开指定网页