在現有程式中,字串當之無愧是門庭要塞,而字串匹配也使用頻率也相當的高,以往的
做法是使用暴力破解,通過列舉所有字串匹配狀態進行判定,但那也造成時間複雜度
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位 如果不...