1. 程式人生 > >【面試題】KMP演算法實現

【面試題】KMP演算法實現

what!?

KMP演算法是幹嘛的?

我們可能都知道樸素演算法,主要是解決兩個字串的匹配問題,其實KMP演算法可以說和樸素演算法是師出同門,為什麼這麼講呢?首先我們對比一下兩個的程式碼,大家就知道怎麼回事了。

樸素演算法

int BF(const char *str1, const char *str2, int pos) //樸素演算法時間複雜度O(n*m)
{
    if(pos < 0)
    {
        return -1;
    }
    int lenstr1 = strlen(str1);
    int lenstr2 = strlen(str2);
    int i = pos;
    int j = 0;
 
    while(i < lenstr1 && j < lenstr2)
    {
        if(str1[i] == str2[j])
        {
            i++;
            j++;
        }
        else //失配
        {
            i = i - j + 1; //主串str1退到i原來的位置的下一個
            j = 0;  //str2退回到起點
        }
    }
 
    if(j >= lenstr2)//匹配到子串
    {
        return i - j;
    }
    else
    {
        return -1;
    }
}

KMP演算法

int GetNext(const char*str,int* next,int n) 
{ 
    next[0]=-1; int k=-1;//字首最後一個字元,也就是next[k] 
    int j=0;//失配字元的前一個字元 
    while(j<n-1) 
    { 
       if(k==-1 || str[k]==str[j])
       { 
          k=k+1; j=j+1; next[j]=k; 
       } 
       else 
       { 
          k=next[j]; 
       }
    } 
}

KMP演算法總結一下:

    首先,當前失配的前一位( str[j-1] )如果等於next[j-1],那麼將next[j-1]+1就是下一位next陣列的值,如果不相等,判斷next[next[j-1]]是否和失配的前一位相等,依次迴圈比較,直到等於-1結束迴圈。