1. 程式人生 > >模式匹配演算法思想和實現KMP

模式匹配演算法思想和實現KMP

首先模式匹配演算法解決的問題是在一個主串和一個模式匹配串中查詢相同的模式匹配串,如果相等,則返回當前模式匹配串的起始位置,否則返回-1
實現思路:
/**

  • 首先第一個大前提就是長度
  • 第二個是判斷二者是否相等,然後同時後移
  • 否則直接回退到i = i - j + 1 (每次在原來的基礎上後移一位)j=1,
  • 返回主串匹配的模式串的首地址 j > t[0] 返回是 I- t[0]
    */
    程式碼實現
   int ModelStartType(SString s,SString t){
        //模式匹配演算法,比較字串S中是否包含子串t,如果包含,返回開始匹配下標,否則返回-1
        //定義初試比較下標
        int i=1,j= 1;
        //首先保證比較的兩個字串長度大於等於1
        while(i <= s[0] && t <= t[0]){
            //然後進行比較 ==
            if (s[i] == t[j]){
                //如果相等,二者同時進行後移繼續比較
                i++;
                j++;
            }else {
                //否則進行回退再次比較,指標進行回退繼續比較
                i = i - j + (1 + 1);
                j = 1;
            }
            //返回主串匹配到的模式串的首地址
            if (j > t[0]){
                return i - t[0];
            }else {
                return 0;
            }
        }
    }

實現思路:這裡採用KMP演算法進行優化,每次在比較出現回退到初試位置進行優化,新增next記錄將要移動的字元,從而提高了比較的效率,不用每次都回到到1
/**
* t是需要進行校驗的字串,next用於儲存下一次將要比較的移動的字串
* 首先第一個大前提是 需要比較的字串長度
* 如果移動的位置為0或者字串的 在二者前後值進行比較,相等
* 後者同時進行後移,next用於儲存j下一次需要移動的字元
* 否則交換的字元賦值給j
* */

 void get_next(char t[],int next[]){
       //使用改進的KMP演算法進行判斷模式子串在字串中的匹配位置
        int i = 1;
        next[1] = 0;
        int j = 0;
        //t[0] 用於保留字串的長度
        while(i <= t[0]){
            if (j == 0 || t[i] == t[j]){
                ++i;
                ++j;
                next[i] = j;
            }else {
                j = next[j];
            }
        }
    }