编写一个程序实现模式串的各种模式匹配
2016-07-02 15:25
435 查看
/* *Copyright (c) 2016, 烟台大学计算机学院 *All rights reserved. *文件名称:main.cpp *作者:张旺华 *完成日期: 2016 年 7 月 2 日 *版本号:v1.0 *问题描述:编写一个程序实现模式串的各种模式匹配 * */ #include <stdio.h> #define MaxSize 100 //最多的字符个数 typedef struct { char data[MaxSize]; //定义可容纳MaxSize个字符的空间 int length; //标记当前实际串长 } SqString; void StrAssign(SqString &s,char cstr[]) //s为引用型参数 { int i; for (i=0; cstr[i]!='\0'; i++) s.data[i]=cstr[i]; s.length=i; } void DispStr(SqString s) { int i; if (s.length>0) { for (i=0; i<s.length; i++) printf("%c",s.data[i]); printf("\n"); } } int Index(SqString s,SqString t) //简单匹配算法 { int i=0,j=0; while (i<s.length && j<t.length) { if (s.data[i]==t.data[j]) //继续匹配下一个字符 { i++; //主串和子串依次匹配下一个字符 j++; } else //主串、子串指针回溯重新开始下一次匹配 { i=i-j+1; //主串从下一个位置开始匹配 j=0; //子串从头开始匹配 } } if (j>=t.length) return(i-t.length); //返回匹配的第一个字符的下标 else return(-1); //模式匹配不成功 } void GetNext(SqString t,int next[]) { int j,k; j=0; k=-1; next[0]=-1; while(j<t.length-1) { if(k==-1||t.data[j]==t.data[k]) { j++; k++; next[j]=k; } else k=next[k]; } } int KMPIndex(SqString s,SqString t) { int next[MaxSize],i=0,j=0; GetNext(t,next); while(i<s.length&&j<t.length) { if(j==-1||s.data[i]==t.data[j]) { i++; j++; } else j=next[j]; } if(j>=t.length) return(i-t.length); else return(-1); } void GetNextval(SqString t,int nextval[]) //由模式串t求出nextval值 { int j=0,k=-1; nextval[0]=-1; while (j<t.length) { if (k==-1 || t.data[j]==t.data[k]) { j++; k++; if (t.data[j]!=t.data[k]) nextval[j]=k; else nextval[j]=nextval[k]; } else k=nextval[k]; } } int KMPIndex1(SqString s,SqString t) //修正的KMP算法 { int nextval[MaxSize],i=0,j=0; GetNextval(t,nextval); while (i<s.length && j<t.length) { if (j==-1 || s.data[i]==t.data[j]) { i++; j++; } else j=nextval[j]; } if (j>=t.length) return(i-t.length); else return(-1); } int main() { int j; int next[MaxSize],nextval[MaxSize]; SqString s,t; StrAssign(s,"abcabcdabcdeabcdefabcdefg"); StrAssign(t,"abcdeabcdefab"); printf("串s:"); DispStr(s); printf("串t:"); DispStr(t); printf("简单匹配算法:\n"); printf(" t在s中的位置=%d\n",Index(s,t)); GetNext(t,next); //由模式串t求出next值 GetNextval(t,nextval); //由模式串t求出nextval值 printf(" j "); for (j=0; j<t.length; j++) printf("%4d",j); printf("\n"); printf(" t[j] "); for (j=0; j<t.length; j++) printf("%4c",t.data[j]); printf("\n"); printf(" next "); for (j=0; j<t.length; j++) printf("%4d",next[j]); printf("\n"); printf(" nextval"); for (j=0; j<t.length; j++) printf("%4d",nextval[j]); printf("\n"); printf("KMP算法:\n"); printf(" t在s中的位置=%d\n",KMPIndex(s,t)); printf("改进的KMP算法:\n"); printf(" t在s中的位置=%d\n",KMPIndex1(s,t)); return 0; }
运行结果:
相关文章推荐
- 浅谈内存的泄漏(二)
- git fork别人的项目之后 同步远程分支的方法
- CentOS 7.x NAT模式上网配置1
- wm_concat函数
- Let’s Encrypt 配置
- 请教signal的问题
- Poj 3683 Jimmy’s Assignment【二分匹配】
- Freely Available Software for Linear Algebra (August 2015) 各种求解器的总结
- 中缀表达式转成后缀表达式
- 为程序创建conf.ini文件时需要的类
- Android Socket 遇到的Soure Not Find 错误
- Android自动化测试之环境搭建
- 如何发送一条消息通过 Outlook 对象模型与 VC++
- 一些程序段分析(2)
- Retrofit---java.lang.NoSuchMethodError: No virtual method isSuccess()Z in class Lretrofit2/Response
- 如何混合使用C和C++(上)
- 中维世纪监控某一特定时间段视频的恢复
- Java使用Protocol Buffers入门四步骤
- ubantu终端下只显示当前路径,而不显示绝对路径
- X server:linux 图形界面原理