【面試題】KMP演算法實現
阿新 • • 發佈:2018-12-10
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結束迴圈。