字符串匹配之KMP算法
2016-02-22 14:01
232 查看
代码来自看严蔚敏教授C数据结构视频教程后所写
/*字符串匹配算法 KMP算法*/ #include <stdio.h> #include <stdlib.h> #include <string.h> int next[100];//全局变量 int KMP(char S[],char T[]){ int i=0,j=0;//i指向S,j指向T int length_s=strlen(S),length_t=strlen(T); //printf("%d %d\n",length_s,length_t); while(i<length_s&&j<length_t){ //printf("%c %c\n",S[i],T[j]); /*j==-1表示i指向的字符串与j指向的字符串从第一个字符就不等 i,j均后移,j==-1表示指向第一个字符之前 */ if(j==-1||S[i]==T[j]){ i++; j++; }else{ j=next[j]; } } //匹配结束 if(j>=length_t){ i=i-j;//i回溯到当前匹配的开始地方 return i; } return -1; } void get_next(char *ch,int *next){ //int next[100]; next[0]=-1;//第一个字符设为-1 int i=0,j=-1;//i指向模式字符串,j指向重复字符位置 int length=strlen(ch); while(i<length-1){ if(j==-1||ch[i]==ch[j]){ i++; j++; next[i]=j; } else{ j=next[j]; } } } int main(){ char s[100],t[100]; printf("请输入待匹配字符串:"); scanf("%s",s); printf("请输入匹配字符串:"); scanf("%s",t); get_next(t,next); for(int i=0;i<strlen(t);i++){ printf("%d ",next[i]); } int i=KMP(s,t); if(i!=-1){ printf("从第%d个字符开始",i); } }
相关文章推荐
- IOS程式语法之block的使用掌握
- TypeScript Basic Types(基本类型)
- 我的博客开通啦!
- tomcat普通登录认证
- 十六进制转成字符串形式与字符串形式转hex
- CoAP学习笔记——IETF文档和draft文档
- 加密你的SQLite
- HTML标记语法之表格元素
- Spring Web Flow 2.0 入门
- Android—SVN部署
- Linux 时间相关
- JSF中使用a4j:commandButton和a4j:jsFunction实现校验,操作后刷新
- 三大UML建模工具Visio、Rational Rose、PowerDesign的区别
- Android上玩玩Hook:Cydia Substrate实战
- 条码扫描二维码扫描——ZXing android 源码简化
- [转载][情感]那些应该学会的姿势——安慰
- 【前端】将form数据转化为json再提交
- < a4j:jsFunction >
- JAVA招聘
- GGSN