在字符串t中查找子串p時,求第一次匹配的序號。算法
算法思想:假設t和P是兩個給定的串,在t中尋找與p相同子串的過程叫作模式匹配,通常t稱爲正文,p稱爲模式,t的長度大於p的長度。若是在t中找到等於p的子串,則匹配成功,不然匹配失敗。ide
設字符串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的子串,那麼匹配失敗。spa
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 }