字符串匹配 KMP算法
来源:互联网 发布:单片机芯片破解 编辑:程序博客网 时间:2024/06/16 16:19
首先先来看一个问题,给出两个字符串,S和T
问T在S中出现了多少次,不允许重复,但允许相互有相同部分。
首先想到的肯定是暴力,可以想到,从S的第一个字符开始,看是否和T相等,然后向后移,统计有多少个相等,那么时间就是
当然,这个速度是非常慢的,如果两个串的长度很长,或者有多组数据,自然就超时了。
显然,在匹配的时候,如果遇到不相等的情况,移到下一位的时候,有很大的几率不会相等,那么可以用一个
这时候就可以这样做:
首先从第一个字符开始,如果相等那么向后匹配,如果失配那么就跳到
那么,有了next,就很容易计算答案了,以下为代码
int kmp() { get_next();//计算next int ans = 0; k=0; for (int i = 0; i < lenS; ++i) { while (k > 0 && S[i] != T[k]) { k = _next[k - 1];//如果失配,那么移动k } if (S[i] == T[k]) { ++k; //如果相等,判断下一位 } if (k == lenT) { //找到了 k = _next[k - 1]; ++ans; //统计找到的串的个数 } } return ans;}
注意一个很重要的东西:
那么,如何求
其实,求
void get__next() { _next[0] = 0; k = 0; for (int i = 1; i <= lenT; ++i) { while (k > 0 && T[i] != T[k]) { k = _next[k - 1]; // 如果找不到,向后移 } if (T[i] == T[k]) { ++k; // 如果找到了 向后移 } _next[i]=k; // 记录 }}
看起来和匹配很像对不对……
事实上,的确和匹配很像。
可以发现,
同时,求到k的时候,k前面的
所以类似这样的方法,去用T去匹配T,直接套用前面的匹配过程。
最后再分析一下时间复杂度。
既然它这么神奇,
那么时间复杂度肯定比
在匹配的时候,在S串中,k每一次
那么,求
这样,KMP就顺利地学完了……
- KMP 字符串匹配算法
- kmp字符串匹配算法
- kmp字符串匹配算法
- KMP字符串匹配算法
- 字符串匹配算法-kmp
- KMP(字符串匹配)算法
- KMP 字符串匹配算法
- 字符串匹配算法:KMP
- KMP算法 字符串匹配
- 字符串匹配 KMP 算法
- KMP字符串匹配算法
- KMP字符串匹配算法
- KMP算法:字符串匹配
- KMP字符串匹配算法
- 字符串匹配--KMP算法
- KMP字符串匹配算法
- KMP字符串匹配算法
- KMP字符串匹配算法
- bzoj3172(ac自动机)
- HDU 2897邂逅明下 (巴什博弈、找规律)
- 顺序栈的基本操作实现c++
- MYSQL --Subquery returns more than 1 row查询结果多于一行
- Error:Execution failed for task ':app:transformClassesWithDexForDebug&#
- 字符串匹配 KMP算法
- leetcode No81. Search in Rotated Sorted Array II
- 「Deep Learning」R-CNN - Region-based Convolutional Neural Networks
- Android Studio样式的使用
- 数据结构上机测试2-1:单链表操作A
- NYOJ-914 Yougth的最大化
- Android应用性能优化系列视图篇——优化之路从Window开始
- NKOI 1941 最长递增子序列
- 链式栈的基本操作实现c++