開始
首先,kmp演算法是用來幹什麼的?用來匹配字串,如果匹配,返回索引值。
其次,為什麼要用kmp演算法?因為能簡化時間複雜度(廢話,演算法都是用來提公升效率的)。
然後,kmp演算法是以什麼方式簡化時間複雜度的?
一般我們匹配字串可以用正規表示式,或者拿這個字串與目標字串乙個個比較,那麼就有乙個問題,如果其中乙個、最壞的是僅僅最後乙個不匹配依然要從頭開始匹配,這就很沒必要,如:
很明顯,它沒有回去從 b 開始匹配,由於前四個字元都一一匹配,且各不相同,直接跳至 a 和 e 比較,然後馬上匹配到正確的字串。
在這裡,模板字串的前四個字元是各不相同的,所有一次跳四位,如果模板字串在失配的字元前的字元有相同的呢?就要用到next陣列。
next陣列
字首字尾就不說了,只講最大公共字串長度
例如乙個模板字串:ababac
為了適應**和一些字串方法,我求最大公共字串長度方式可能有點不一樣。比如abab:就假設在後面這個b處失配時,它的字首字尾最大公共字串長度為1;比如ababac:就假設在 c 處失配時,它的字首字尾最大公共字串長度為3
最後由最大公共字串長度值,組成陣列next陣列,最重要的是next陣列的用法。
**區先看總體**
const str = 'abababababac';
const mat = 'ababac';
* @param str 目標字串
* @param mat 模板字串
function kmp(str, mat) else else 處`;
return '沒找到';
next陣列產生部分
無論哪個字串,它的前兩個字元的最大公共字串長度都是0,因此上面直接賦值const next=[ 0, 0]。
利用slice方法,每次擷取乙個子字串,然後迴圈,繼續擷取,比較是否相等,得到最大長度後,直接賦值給next陣列。細節地方就是,按照我的方法看待最大公共字元長度,字串最後一位是假設它失配,看它字首字尾匹配個數就好。因此,slice方法不用擷取模板字串的最後一位。
// 該迴圈求出 next 陣列
for (let i = 2; i <= matlen - 1; i++) else else 處`;
return '沒找到';
標籤:字元,匹配,淺顯易懂,next,索引,kmp,字串,js,模板
KMP演算法JS實現
參考阮一峰的 字串匹配的kmp演算法 用js實現一版,備忘 主串let str1 bbc abcdab abcdabcdabdedc 模式串 let str2 abcdabd 算出 部分匹配表 partial match table method param str 要計算的字串 return 部分...
js實現kmp演算法 經典演算法系列 KMP演算法
網易等公司在筆試中經常會考察有關字串的題目,因此,我們要掌握相關演算法。通常這些題目會考察模式匹配,以及情況的列舉,因此,本文介紹經典的kmp模式匹配演算法和經典的全排列演算法。下面首先介紹字串相關知識。假定有字串s1,s2,strcpy s1,s2 表示將s2賦值給s1 strcat s1,s2 ...
排序演算法 JS實現
原文引用自這裡,這裡只是我自己的學習的補充以及筆記 時間複雜度,o n2 var arr 5,6,3,1,8,7,2,4 function insertsort arr else return arr console.log insertsort arr 時間複雜度,o n2 var arr 5,1...