在字符串t中查找子串p时,求第一次匹配的序号。
算法思想:假设t和P是两个给定的串,在t中寻找与p相同子串的过程叫做模式匹配,一般t称为正文,p称为模式,t的长度大于p的长度。如果在t中找到等于p的子串,则匹配成功,否则匹配失败。
设字符串t为t[n],字符串p为p[m],其中n,m分别为字符串t和p的长度,实现模式匹配的简单算法为:对于i=0,1,2,..n-m,依次进行下面匹配步骤,最多进行n-m+1次。匹配步骤为,用p[0],p[1],...p[m-1]依次与t[i],t[i+1]...t[i+m-1]进行比较,如果p[0]=t[i],p[1]=t[i+1],。。。p[m]=t[i+m-1],那么匹配成功,整个算法结束,否则,一定存在某个整数k,0<=k<=m-1,使得p[k]!=t[k+1],一旦出现这种问题,终止比较,执行下一次的匹配步骤,如果执行了n-m+1次匹配步骤后,在t中没有找到 等于p的子串,那么匹配失败。
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include <string.h> 4 #include<ctype.h> 5 int bali(char *t,char *p) 6 { 7 int m,n,i,j,bool; 8 n=strlen(t);m=strlen(p);/*取字符串长度*/ 9 i=0;bool=1; 10 while((i<=n-m)&&(bool!=0))/*从第一个查询,子串是否在主串中*/ 11 {j=0; 12 while((j<=m-1)&&(p[j]==t[i+j]))/*若第一轮相同,可继续查找,否则进行下一轮继续查找*/ 13 j++; 14 if(j<=m-11) 15 { 16 bool=1;i++;/*若未查到继续查找*/// 17 } 18 else 19 bool=0;/*查找到了bool为0*/ 20 } 21 if(bool==0) 22 {cout<<"存在目标模式,且第一次匹配序号为"<<endl; 23 return (i+1);/*查找到返回首字符所在的位置*/ 24 } 25 else{ 26 cout<<"不存在目标模式"<<endl; 27 return (0);/*bool=1,返回0,表示串p不在t中*/ 28 } 29 } 30 void main(){ 31 int k; 32 char str1[]="adedefghdefijk"; 33 char str2[]="def"; 34 k=horspool(str1,str2); 35 printf("k=%d\n",k); 36 }