字符串模式匹配


參考:https://www.cnblogs.com/lufangtao/p/3245647.html

1.簡單模式匹配

 從主串的第pos位置字符開始和模式子串字符比較,如果相等,則繼續逐個比較后續字符;否則從主串的下一個字符起再重新和模式子串的字符比較。直到找到匹配字符串或者是主串結尾。其中主串需要回溯到失配的位置的下一個位置,子串回溯到最開始位置

例如,主串T為:ababcabababab,子串為ababa,上述過程如下圖所示。

 

參考代碼

  /*
檢測從主串T的pos位置開始,是否有和子串S匹配,如果有返回匹配開始位置,如果沒有,返回-1
T:主串
 S:子串
tlength:主串長度
slength:子串長度
pos:主串開始位置
*/
 int Index (char T[],char S[],int tlength,int slength,int pos)
{
    int j=0,i=pos;
     while(i<tlength&&j<slength)
     {
        if(T[i]==S[j])
         {
             i++;
             j++;
         }
         else
         {
             i=i-j+1;
             j=0;
         }
     }
     return j==slength?i-slength:-1;
 
 }
 

2.KMP算法

 與簡單算法的區別,KMP的特點是主串不用回溯,只需回溯子串即可, 即只需給子串找到一個“合適的位置”接着進行匹配,而不用挪動主串。我們的任務就是確定這個“合適的位置",從而引出了next數組。我們用next[j]表示當模式子串中第j個字符與主串中相應的字符失配時,在模式串中需要重新和主串比較的字符位置。需要說明的是,求next數組時只與模式字串自身的結構有關系,與主串無關。

另next數組求法:https://blog.csdn.net/wenyun_kang/article/details/65436838

參考代碼

 1 int KMP_Index(char T[],char S[],int tlength,int slength,int pos)
 2 {
 3     int *next=(int*)malloc(slength*sizeof(int));
 4     KMP_Next(S,next,slength);
 5 
 6     int j=-1,i=pos-1;
 7     while(i<tlength&&j<slength)
 8     {
 9         if(j==-1||T[i]==S[j])
10         {
11             i++;
12             j++;
13         }
14         else
15             j=next[j];
16     }
17     return j==slength?i-slength:-1;
18 
19 
20 }
View Code

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM