在字符串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 }
View Code