關於KMP演算法思想及過程實現 個人理解

2021-10-02 16:28:05 字數 1178 閱讀 9681

在現有程式中,字串當之無愧是門庭要塞,而字串匹配也使用頻率也相當的高,以往的

做法是使用暴力破解,通過列舉所有字串匹配狀態進行判定,但那也造成時間複雜度

o(n*m)相當高,為此提出kmp演算法,有效降低時間複雜度至o(n+m)

暴力演算法:

#includeusing namespace std;

void massacre();

scanf("%s",match_str);

while(match_str[loopindex] != '\0')else

}}

首先backpot表示回溯點的位置,loopindex用來遍歷整個模式串,當如果backpot為模式串頭部或者存在前字尾字元相等,就將其+1,並記入到 next陣列中,如果不匹配,證明當前字元不在重複,backpot回溯到字首x點重新匹配。

next求出,那麼kmp演算法也就算完成了,如下**:

#includeusing namespace std;

void kmp_(),match_str[100] = ;

int i,j;

scanf("%s\n%s",str,match_str);

next[0] = -1;

//尋找模式串前字尾子串的匹配next域

while(match_str[loopindex] != '\0')else

}for(i=0,j=0;str[i]!='\0'&&match_str[j]!='\0';)

//優化演算法,如果字首子串的後乙個字元仍不相等,則繼續向前回溯

else if(str[i] != match_str[next[j]] && j != 0)

else

}int loc = i-strlen(match_str);

char ans[100] = ;

strncpy(ans,str+loc,strlen(match_str));

printf("%s location in %d",ans,loc+1);

}int main()

輸入:abcdadealkagoasda

ago輸出:

ago location in 11

以上內容表述可能有些抽象,可能也存在錯誤,有何誤點還請大家指教,謝謝

KMP演算法的實現過程

樸素的字串匹配演算法的時間複雜度為o m n m n分別為主串 模式串的長度。容易理解的是,主串和模式串的指標同步進行,當遇到不匹配的字元時,主串指標將移動到當前指標下一位,因此最壞情況下m個字元都要匹配n次。而kmp演算法能在o m n 的時間複雜度內完成查詢,原理不再介紹,下面介紹實現過程。1 ...

KMP演算法基本思想與實現

kmp演算法 演算法思想 t0.t j i t j 1 tj p0 p i 1 pi 即在比較的過程中有 p 0.i 1 t j i.j 1 再往下匹配時 pi tj 如果找到k值使 p 0.i k 1 p k.i 1 這樣字元創p可以移動k位 因為p k.i 1 與tj 1前面的i 1 k為相等 ...

KMP演算法及python實現

kmp演算法是一種在字串匹配中應用十分廣泛 也十分高效的演算法,就是查詢模式串 子串 在目標串 主串 現的位置,具體的問題可參考leetcode 28.實現strstr 題面如下圖所示。最暴力的演算法就是 模式串的第0位與目標串的第0位進行比較,如果匹配,則比較模式串的第1位與目標串的第1位 如果不...