KMP演算法詳解

2021-10-06 21:31:22 字數 2658 閱讀 1615

(1)有一字串str1=「bbc abcdab abcdabcdabde」,和乙個子串str2=「abcdabd」

(2)現在要判斷str1是否含有str2,如果存在,就返回第一次出現的位置,如果沒有,就返回-1

2.1如果使用暴力匹配的思路,並假設現在str1匹配到i位置,子串str2匹配到j的位置,則有:

(1)如果當前字元匹配成功(即str1[i] == str2[j]),則i++,j++,繼續匹配下乙個字元

(2)如果匹配失敗(即str1[i] != str2[j]),令i = i - (j - 1),j=0。相當於每次匹配失敗時,i回溯,j被置為0。

(3)用暴力方法解決的話就會有大量的回溯,每移動一位,若是不匹配,移動到下一位接著判斷,浪費了大量的時間

2.2**實現

public

class

violencematchdemo

/** * 暴力匹配演算法實現

* @param str1 目標字串

* @param str2 要匹配的字串

* @return 如果str1中含有str2,就返回str2第一次出現的位置,如果不包含就返回-1

*/public

static

int violencematch (string str1, string str2)

else

}//如果j == 0 ,說明沒有匹配到

if(j ==0)

return i-j;

}}

3.1kmp演算法介紹

(1)knuth-morris-pratt字串查詢演算法,簡稱為「kmp演算法」,常用於在乙個文字串s內部查詢乙個模式串p的出現位置,這個演算法由donald knuth、vaughan pratt、james h.morris三人於2023年聯合發表,顧取3人的姓氏命名演算法

(2)kmp方法演算法就利用之前判斷過資訊,通過next陣列,儲存模式串中前後最長公共子串行的長度,每次回溯時,通過next陣列找到,前面匹配過的位置,省去了大量時間

3.2kmp演算法最佳應用–字串匹配問題

3.2.1字串匹配問題

(1)有乙個字串str1=「bbc abcdab abcdabcdabde」,和乙個子串str2=「abcdabd」

(2)現在要判斷str1是否含有str2,如果存在,就返回第一次出現的位置,如果沒有,則返回-1

(3)不能使用暴力匹配,要使用kmp演算法

3.2.2kmp演算法的思路分析「a」的字首和字尾都為空集,共有元素的長度位0

「ab」的字首為[a],字尾為[b],公共元素的長度為0

「abc」的字首為[a,ab],字尾為[bc,c],共有元素的長度為0

」abcd「的字首為[a,ab,abc],字尾為[bcd,cd,d],共有元素的長度為0

」abcda「的字首為[a,ab,abc,abcd],字尾為[bcda,cda,da,a],共有元素的長度為1

」abcdab「的字首為[a,ab,abc,abcd,abcda],字尾為[bcdab,cdab,dab,ab,b],共有元素的長度為2

」abcdabd「的字首為[a,ab,abc,abcd,abcda,abcdab],字尾為[bcdabd,cdabd,dabd,abd,bd,d],共有元素的長度為0

3.3**實現

/**

* @author xujin

* @createtime 2020-06-06 17:46

* @description

*/public

class

kmpalgorithmdemo

/** * kmp演算法

* @param str1 源字串

* @param str2 目標字串

* @param kmpnext 目標字串的部分匹配值標

* @return 如果str1中含有str2,就返回str2第一次出現的位置,如果不包含就返回-1

*/public

static

intkmpsearch

(string str1, string str2,

int[

] kmpnext)

if(str1.

charat

(i)== str2.

charat

(j))

if(j == str2.

length()

)}return-1

;}/** * 得到字串的部分匹配標

* @param target 目標字串

* @return 目標字串的部分匹配標

*/public

static

int[

]getkmpnext

(string target)

if(target.

charat

(i)== target.

charat

(j))

next[i]

= j;

}return next;

}}

KMP演算法詳解

模式匹配的kmp演算法詳解 這種由d.e.knuth,j.h.morris和v.r.pratt同時發現的改進的模式匹配演算法簡稱為kmp演算法。大概學過資訊學的都知道,是個比較難理解的演算法,今天特把它搞個徹徹底底明明白白。注意到這是乙個改進的演算法,所以有必要把原來的模式匹配演算法拿出來,其實理解...

KMP演算法詳解

kmp演算法即knuth morris pratt演算法,是模式匹配的一種改進演算法,因為是名字中三人同時發現的,所以稱為kmp演算法。因為偶然接觸到有關kmp的問題,所以上網查了一下next陣列和 nextval陣列的求法,卻沒有找到,只有在csdn的資料檔案裡找到了next陣列的簡單求法 根據書...

KMP演算法詳解

相信很多人 包括自己 初識kmp演算法的時候始終是丈二和尚摸不著頭腦,要麼完全不知所云,要麼看不懂書上的解釋,要麼自己覺得好像心裡了解kmp演算法的意思,卻說不出個究竟,所謂知其然不知其所以然是也。經過七八個小時地仔細研究,終於感覺自己能說出其所以然了,又覺得資料結構書上寫得過於簡潔,不易於初學者接...