這種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...