字符串模式匹配——KMP算法
2013-03-24 11:14
218 查看
字符串的模式匹配问题即为在一串字符A当中寻找到一个子串使得子串与另一个字符串完全相同,把子串起始的下标输出即可。
对于这个问题,可以很直白的进行解决,也就是通常说的朴素的模式匹配,但是相对来说时间复杂度较高,为L(A)*L(B)。作为改进,KMP算法的时间复杂度只是线性的,所以更优。
KMP算法的本身代码实现并不复杂,思想框架也不复杂,但是里面的利用失败函数寻找next值方法却不好理解。
它的具体的思想和算法过程,想要学习的可以网上搜一下,应有竟有,这里只粘出代码,但是敢肯定的是,只看代码是肯定理解不了的...
对于这个问题,可以很直白的进行解决,也就是通常说的朴素的模式匹配,但是相对来说时间复杂度较高,为L(A)*L(B)。作为改进,KMP算法的时间复杂度只是线性的,所以更优。
KMP算法的本身代码实现并不复杂,思想框架也不复杂,但是里面的利用失败函数寻找next值方法却不好理解。
它的具体的思想和算法过程,想要学习的可以网上搜一下,应有竟有,这里只粘出代码,但是敢肯定的是,只看代码是肯定理解不了的...
#include<stdio.h> char target[1000]={'a','c','a','b','a','a','b','c','a','c','c','a','c','b','d'}; char pattern[100]={'a','b','c','a','c'}; int nextp[100]; int plength=5; int tlength=15; void getNext() { nextp[0]=-1; int k=-1,j=1; while(j<plength) { if(k==-1||pattern[k]==pattern[j]) { k++;j++; if(pattern[k]!=pattern[j]) { nextp[j]=k; } else { nextp[j]=nextp[k]; } } else { k=nextp[k]; } } } int match() { int i=0,j=0; while(i<plength&&j<tlength) { while((pattern[i]==target[j])&&(i<plength&&j<tlength)) { ++i;++j; } if(i<plength&&j<tlength) { if(nextp[i]>-1) { i=nextp[i]; } else { i=0; j++; } } else { break; } } if(i==plength) { return j; } else { return -1; } } int main() { getNext(); int i; for(i=0;i<plength;i++) { printf("%d\t",nextp[i]); } printf("\n"); printf("%d\n",match()-plength); }
相关文章推荐
- 字符串模式匹配——KMP算法(时间复杂度为O(m+n))
- 字符串模式匹配KMP算法
- 字符串模式匹配的KMP算法
- 字符串模式匹配KMP算法
- 字符串模式匹配KMP算法
- 字符串模式匹配KMP算法
- 字符串模式匹配算法--详解KMP算法
- Java数据结构之字符串模式匹配算法---KMP算法
- 字符串模式匹配算法--BF & KMP算法
- 字符串的模式匹配---KMP算法详解--个人觉得最nice的KMP算法解析了
- 大话数据结构十一:字符串的模式匹配(KMP算法)
- 字符串的模式匹配详解--BF算法与KMP算法
- 字符串模式匹配KMP算法
- 字符串模式匹配算法1 - BF和KMP算法
- 字符串模式匹配之KMP算法图解与 next 数组原理和实现方案
- 字符串模式匹配KMP算法
- 字符串模式匹配----KMP算法
- 字符串模式匹配KMP算法
- 字符串模式匹配——KMP算法
- 字符串模式匹配KMP算法