c語言實現kmp演算法,簡化易記版

2022-06-24 09:00:13 字數 1186 閱讀 4144

這種kmp演算法很簡單

**也沒有網上的那麼複雜,簡單易懂

void creatprefix(char pattern,int prefix,intn)

}void moveprefix(int prefix,intn)

void kmp_search(char text,char pattern,int n,intprefix)

if(text[i]==pattern[j])

else

else

j=prefix[j];}}

}intmain()

下面是偽**講解

kmp演算法第一步需要求出字串的prefix字首式

首先將prefix的第一項設為0

在pattern迴圈完畢之前

進行pattern[j]和pattern[i]進行比較

if相等

將此時的i值向右移動一格,i自增

將此時的自增過後的i值賦值給pattern[j]所對應的prefix[j]表

j向右移動

if !相等

如果此時的i值是大於零的

將i項左邊一項的prefix值附給i,讓i的位置移動到prefix[i-1]的值對應的位置上

如果不相等,而且此時的i已經是0了,如果再-1就變成負數,會讓i指向乙個不知道的地方

則此時的prefix[j]對應的值為0

將求得的prefix整體向右移動,第一項補-1開始kmp_search演算法

首先設定text串(一堆亂七八糟的文字串)的長度為m,用i在text中遍歷

pattern串(目標查詢串)的長度為n,用j在其中遍歷

while(i文字串[j]的字元等於目標串[i])

printf出目標串在文字串中第一次出現的位置

j重新回到prefix[j]所指向的位數

if(目標串[i]==文字串[i])

i++;j++;//i,j整體後移,開始比較下一項是否相等

else//不相等

if既不相等,而且當前的j的prefix[j]的值為-1i++;j++;i,j整體後移,跳過當前的字串開始進行下乙個字元的比對

否則pattern當前的j回到prefixtab[j]所指向的pattern的位置

這種簡化版的**容易理解,以後抽時間講解時如何實現的

KMP演算法詳解(C語言實現)

kmp的演算法分析 kmp解決問題 清除bf演算法中主串s指標出現的回溯情況,即當主串s和子串t在某個字元不匹配的時侯,主串s的指標位置不變,改變子串t的指標位置,使主串和子串的字元匹配 演算法思路 建立乙個next陣列,當出現主串字元與子串字元不匹配時,將模式串t的指標 j 移動到next j 的...

演算法 KMP演算法完全解析(C語言實現)

kmp演算法所做的事情,就是在字串中尋找子串。比如ilovecode這個字串中,我們可以搜尋到love這個子串。但如果用回溯的暴力方法尋找子串 即兩個for迴圈 雖然思路簡單,但是時間複雜度為o m n 借助kmp演算法,可將複雜度降為乙個迴圈,增進了效率。1 字首和字尾的概念 字首 指的是從首字元...

Go語言實現kmp演算法(一)

kmp演算法分為兩部分,第一部分為next陣列的獲取,第二部分為使用next陣列進行匹配,兩部分採用的思路大體相同。該演算法有多種方式實現,此處介紹移動的方式實現,還有教科書上的手算方法實現,即計算最大前後子串長度,將next陣列向後一位,首位置為 1,則匹配過程中移動距離等於 當前index in...