4.3模式匹配-KMP算法
来源:互联网 发布:中国民企军火出口知乎 编辑:程序博客网 时间:2024/06/13 00:36
4.3模式匹配-KMP算法
详细介绍:参考http://blog.csdn.net/v_july_v/article/details/7041827
KMP算法特征:不需回溯指针i,一口气走到底。
j指针走的形式,符合next[ j ]函数;
(1)KMP算法来历
Knuth-Morris-Pratt 字符串查找算法,简称为 “KMP算法”,常用于在一个文本串S内查找一个模式串P 的出现位置,这个算法由Donald Knuth、Vaughan Pratt、James H. Morris三人于1977年联合发表,故取这3人的姓氏命名此算法。
(2)KMP算法
int Index_KMP(char *s,char *p){int i , j;int sLen = strlen(s); int pLen = strlen(p);i = j = 0;while(i < sLen && j < pLen){if(j == -1 || s[i] == p[j])//首位不匹配 || 相匹配{i ++;j ++;}else{j = next[j];//提示:右移位数为 j - next[j]}}if(j == pLen)return i - pLen +1;elsereturn -1;}
(3)模式匹配
# include <stdio.h># include <string.h>void Init_string(char *s,char *p); int Index_KMP(char *s,char *p);void get_next(char *p);void print(int i);int next[50];int main(){int i;char s[50];char p[50];Init_string(s,p);get_next(p);i = Index_KMP(s,p);print(i);return 0;}void Init_string(char *s,char *p){printf("input string s , p:\n");gets(s);gets(p);}void get_next(char *p){int i, j;int pLen = strlen(p);next[0] = -1;//按定义首位赋值-1for(i = 0,j = -1; i < pLen; ){if(j == -1 || p[i] == p[j]){++ i;++ j;if(p[i] != p[j])next[i] = j;elsenext[i] = next[j];//因为 不能出现p[i] == p[next[i]] } //所以 继续递归,next[i] = next[j]else{j = next[j];}}}int Index_KMP(char *s,char *p){int i , j;int sLen = strlen(s); int pLen = strlen(p);i = j = 0;while(i < sLen && j < pLen){if(j == -1 || s[i] == p[j])//首位不匹配 || 相匹配{i ++;j ++;}else{j = next[j];//提示:右移位数为 j - next[j]}}if(j == pLen)return i - pLen +1;elsereturn -1;}void print(int i){if(i == -1)printf("String p not be found !\n");elseprintf("The pos is: %d\n",i); }
(4)性能分析
/*时间复杂度:O(m + n)*/
/*空间复杂度:O(n)*/
参考:http://blog.csdn.net/v_july_v/article/details/7041827
0 0
- 4.3模式匹配-KMP算法
- 模式匹配---KMP算法
- 模式匹配 KMP算法
- 模式匹配-KMP算法
- KMP模式匹配算法
- KMP模式匹配算法
- KMP模式匹配算法
- 模式匹配kmp算法
- 模式匹配算法kmp
- KMP模式匹配算法
- KMP模式匹配算法
- KMP模式匹配算法
- KMP模式匹配算法
- KMP模式匹配算法
- KMP模式匹配算法
- KMP模式匹配算法
- KMP模式匹配算法
- KMP算法模式匹配
- distinct subsequence
- Windows Auzre 微软云计算产品后台操作界面
- Linux yum源设置为本地文件夹
- 生活之手机控制电脑
- linux系统盘满了
- 4.3模式匹配-KMP算法
- bzoj 1741: [Usaco2005 nov]Asteroids 穿越小行星群
- 根据URL加载图片并付给bitmap(微信分享中使用)
- 博客搬家
- IT痴汉的工作现状21-Android开发前景论
- 搭建hadoop集群环境
- Android学习第一课笔记
- UVA - 10098 Generating Fast
- MMU和cache学习