字符串匹配算法之KMP
2015-08-12 10:48
411 查看
给定两个字符串S、P,如何判断S中包含P?(假设S为较长字符串,要求P中字符在S中要连续出现)
这就是经典的字符串匹配问题。暴力匹配略去不说,一种较好的解法就是KMP。对于一个新手来说,想学习KMP,建议看如下两篇文章:
如果对第二篇中next数组的讲解不是很懂的话,建议看这篇
分析:
如果文本串的长度为n,模式串的长度为m,那么匹配过程的时间复杂度为O(n),算上计算next的O(m)时间,KMP的整体时间复杂度为O(m + n)。
Reference:
这就是经典的字符串匹配问题。暴力匹配略去不说,一种较好的解法就是KMP。对于一个新手来说,想学习KMP,建议看如下两篇文章:
字符串匹配的KMP算法(阮一峰)
从头到尾彻底理解KMP(2014年8月22日版)如果对第二篇中next数组的讲解不是很懂的话,建议看这篇
【经典算法】——KMP,深入讲解next数组的求解
本文主要给出kmp的实现:int getnext(char *p, int next[]) { int len = strlen(p); next[0] = -1; int k = -1, j = 0; while (j < len) { while (k >= 0 && p[j] != p[k]) { k = next[k]; } k++; j++; next[j] = k; } return 0; } void kmp(char *s, char *p) { int slen = strlen(s); int plen = strlen(p); int *next = new int[plen + 1]; // size is plen + 1 getnext(p, next); int i = 0, j = 0; while (i < slen) { while (j >= 0 && s[i] != p[j]) { j = next[j]; } i++; j++; if (j == plen) { printf("found substring at index: %d\n", i - j); j = next[j]; // to find more matches } } delete [] next; // do not forget }
分析:
如果文本串的长度为n,模式串的长度为m,那么匹配过程的时间复杂度为O(n),算上计算next的O(m)时间,KMP的整体时间复杂度为O(m + n)。
Reference:
algorithm to find substring in a string (KMP Algorithm)
相关文章推荐
- LeetCode:Implement Queue using Stacks
- 整洁代码2
- xquery 除法 和节点个数
- 8月第1周全球域名商(国际域名)新增注册量TOP20
- linux模糊查询文件并删除
- Unity笔记 Graphics( 光 shader camera mesh )
- Bit Manipulation - Subsets
- [leetcode] Palindrome Linked List
- dsp 新扣费逻辑
- ACM练习的建议
- 人脸检测之Haar分类器
- 博文收藏夹(updating)
- LeetCode题解:Power of Two
- java
- PAT 1034. Head of a Gang (30)
- Apache多站点设定
- HDU 3394 双连通分量 桥 Railway
- Java多线程学习笔记
- mysql更改字符编码
- Objective-C——判断对象等同性