串的模式匹配算法 穷举与KMP
2011-12-27 23:12
363 查看
//穷举算法 #include <stdio.h> #include <stdlib.h> const int maxLen=128; typedef struct String { int curLen; char *ch; int f[]; }String; int fastFind(String Tar,String Pat) { int posP=0,posT=0; int lengthP=Pat.curLen,lengthT=Tar.curLen; while(posP<lengthP&&posT<lengthT) { if(Pat.ch[posP]==Tar.ch[posT]) { posP++;posT++; } else if(posP==0) posT++; else posP==Pat.f[posP-1]+1; } if(posP<lengthP) return -1; else return posT-lengthP; } void fail(String Pat) { int lengthP=Pat.curLen; int j=1; Pat.f[0]=-1; printf("%d ",Pat.f[0]); for(j=1;j<lengthP;j++) { int i=Pat.f[j-1]; printf("%c ",*(Pat.ch+j)); printf("%c ",*(Pat.ch+i+1)); while((*(Pat.ch+j)!=*(Pat.ch+i+1))&&(i>=0)) i=Pat.f[i]; if(*(Pat.ch+j)==*(Pat.ch+i+1)) Pat.f[j]=i+1; else Pat.f[j]=-1; printf("%d ",Pat.f[j]); } } int main(int argc, char *argv[]) { String Tar,Pat; char T[maxLen],P[maxLen]; int position; printf("输入目标串(长度小于等于128)"); gets(T);Tar.ch=T;Tar.curLen=strlen(T); printf("输入模式串(长度小于等于128)"); gets(P);Pat.ch=P;Pat.curLen=strlen(P);fail(Pat); position=fastFind(Tar,Pat); printf("模式串在目标串的起始位置为:"); printf("%d",position); system("PAUSE"); return 0; } //KMP算法 #include <stdio.h> #include <stdlib.h> #include<string.h> typedef struct String { int curLen; char *ch; int f[]; }String; int fastFind(String Tar,String Pat) { int posP=0,posT=0; int lengthP=Pat.curLen,lengthT=Tar.curLen; while(posP<lengthP&&posT<lengthT) //目标和模式指针都没指到最后 { if(Pat.ch[posP]==Tar.ch[posT]) { posP++;posT++; //若相等则继续比较 } else if(posP==0) posT++; //第一个字符不相等,目标指针加1 else posP=Pat.f[posP-1]+1; //模式指针右移 } if(posP<lengthP) return -1; //匹配失败 else return posT-lengthP; //匹配成功,返回存储位置 } void fail(String Pat) { int lengthP=Pat.curLen; int j=1; Pat.f[0]=-1; //直接赋值 // printf("%d ",Pat.f[0]); for(j=1;j<lengthP;j++) //依次求f [j] { int i=Pat.f[j-1]; // printf("%c ",*(Pat.ch+j)); // printf("%c ",*(Pat.ch+i+1)); while((*(Pat.ch+j)!=*(Pat.ch+i+1))&&(i>=0)) i=Pat.f[i]; //递推 if(*(Pat.ch+j)==*(Pat.ch+i+1)) Pat.f[j]=i+1; else Pat.f[j]=-1; // printf("%d ",Pat.f[j]); } } int main(int argc, char *argv[]) { String Tar,Pat; char T[128],P[128]; int position; printf("输入目标串(长度小于等于128)"); gets(T);Tar.ch=T;Tar.curLen=strlen(T); printf("输入模式串(长度小于等于128)"); gets(P);Pat.ch=P;Pat.curLen=strlen(P);fail(Pat); position=fastFind(Tar,Pat); printf("模式串在目标串的起始位置为:"); printf("%d",position); system("PAUSE"); return 0; }
相关文章推荐
- KMP模式匹配算法分析与实现
- C语言 算法"KMP" 查找字符串 ”模式匹配“
- KMP字符串模式匹配算法实现(php)
- KMP 快速模式匹配算法
- 计算KMP模式匹配算法中next数组的代码分析及改进型KMP算法中nextval数组代码分析
- 串的模式匹配算法(非kmp)
- java实现字符串的一般和KMP模式匹配算法
- KMP模式匹配算法(1)
- 使用Python语言写一个简单的KMP模式匹配算法实现
- 字符串模式匹配算法——BM、Horspool、Sunday、KMP、KR、AC算法
- KMP模式匹配算法的一些理解
- 模式匹配算法BF和KMP
- KMP(改进模式匹配算法)--串
- 数据结构——串(朴素的模式匹配算法、KMP模式匹配算法)
- KMP字符串模式匹配算法实现
- KMP字符串模式匹配算法
- 算法(四)KMP字符串模式匹配详解
- KMP模式匹配算法
- KMP模式匹配算法
- 算法之旅——KMP模式匹配