字符串中查找子串返回序號

在字符串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 }
View Code
相關文章
相關標籤/搜索