串的模式匹配(BF算法) | 您所在的位置:网站首页 › 通配符字符串匹配算法 › 串的模式匹配(BF算法) |
【问题描述】 串的模式匹配算法BF的实现与应用。 【输入形式】 第一行输入主串s; 第二行输入模式串t; 输入串中均不包含空格字符。 【输出形式】 模式串在主串s中的出现的每一个位置序号。若一次都未匹配到,则输出0。 【样例输入1】 ababcabcacbab ab 【样例输出1】 1 3 6 12 【样例输入2】 111113455113232342432432 11 【样例输出2】 1 2 3 4 10 【样例输入3】 fasdfdsfsadfdsdsagetgrdgfdgdf 2312 【样例输出3】 0 若 s= "abcdefg",t ="efg",则模式 t 在主串中的序号为5。 若 s = "abcdefgabc", t = "abc",如果指定从 s 串的第一个字符开始搜索,则序号为 1 ;如果改变搜索起始位置,如从第三个字符开始搜索,则序号为 8。 模式匹配的基本算法(BF算法) BF算法(Brute Force)是实现模式匹配最简单,最直观的蛮力法。基本思想:按照从左自右的顺序,从主串第 start 个字符起和,模式串的第一个字符比较,以此类推,则继续逐个比较后续字符;否则从 start+1 个字符起重新比较。直到模式串 t 中的每个字符依次和主串 s 中的一个连续的字符序列相等,则匹配成功;否则匹配失败。 算法代码如下: int index_bf(SqString *s,SqString *t,int start) { int i=start-1,j=0; while(ilength&&jlength) //依次比较主串s和子串t对应字符 if(s->data[i]==t->data[j]) //对应字符相等,继续比较下一个字符 { i++; j++; } else //对应字符不相等,i和j回溯,开始下一趟比较 { i=i-j+1; j=0; } if(j>=t->length) //匹配成功,返回子串 t 在主串 s 中的位置 return i-t->length+1; else return 0; }完整代码实现: #include #include #include #include #define INITSIZE 1000 #define INCRE 20 #define OK 1 #define ERROR 0 typedef struct{ char* data; int length,stringsize; }SqString; //串初始化 int initString(SqString *S){ S->data=(char *)malloc(INITSIZE*sizeof(char)); if(!S->data) return 0; S->length=0; S->stringsize=INITSIZE; return 1; } //串赋值 int strAssign(SqString *s, char *str ){ int i=0; while(*str) s->data[i++]=* str++; s->data[i]='\0'; s->length=i; return 1; } //基本模式匹配算法 int index_bf(SqString *s,SqString *t,int start) { int i=start-1,j=0; while(ilength&&jlength) //依次比较主串s和子串t对应字符 if(s->data[i]==t->data[j]) //对应字符相等,继续比较下一个字符 { i++; j++; } else //对应字符不相等,i和j回溯,开始下一趟比较 { i=i-j+1; j=0; } if(j>=t->length) //匹配成功,返回子串 t 在主串 s 中的位置 return i-t->length+1; else return 0; } int main(){ //利用模式匹配算法完成子串查找 SqString S; SqString T; int pos=1,tmp=0; char str[1000]; if(initString(&S)&&initString(&T)) { scanf("%s",&str); strAssign(&S,&str[0]); scanf("%s",&str); strAssign(&T,&str[0]); while(pos |
CopyRight 2018-2019 实验室设备网 版权所有 |