(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演算法的意思,卻說不出個究竟,所謂知其然不知其所以然是也。經過七八個小時地仔細研究,終於感覺自己能說出其所以然了,又覺得資料結構書上寫得過於簡潔,不易於初學者接...