字符串模式匹配
来源:互联网 发布:电脑上画画的软件 编辑:程序博客网 时间:2024/05/22 11:52
#include<stdio.h>#include<string.h>//Naive版本,>>数据结构P79int StringMatch(char* s,char* t){int i=0,j=0;int len_s=strlen(s);int len_t=strlen(t);while(i<len_s && j<len_t){if(s[i]==t[j]){++i;++j;}else{i=i-j+1;//返回到主串的下一个字符重新匹配 j=0;}}if(j==len_t){//匹配成功 ,返回第一个字符的序号return (i-len_t);}else{return (-1);}}//KMP版本void Pre_Handle(char* t,int kobe[],int len_t){ int i=0,j=-1; kobe[0]=-1; while(i<len_t){ if(j==-1||t[i]==t[j]){ ++i; ++j; kobe[i]=j; } else{ j=kobe[j]; } }}int StringMatch_KMP(char* s,char* t){ int i=0,j=0; int len_s=strlen(s); int len_t=strlen(t); int kobe[len_t]; Pre_Handle(t,kobe,len_t); while(i<len_s && j<len_t){ if(j==-1||s[i]==t[j]){ ++i; ++j; } else{ j=kobe[j]; } } if(j==len_t){//匹配成功 ,返回第一个字符的序号 return (i-len_t); } else{ return (-1); }}//testint main(){ char* s="hello,world"; char* t="wor";printf("%d\n",StringMatch(s,t)); printf("%d",StringMatch_KMP(s,t));return 0;}