js實現kmp演算法 js實現KMP演算法,淺顯易懂

2021-10-13 04:16:14 字數 1181 閱讀 8248

開始

首先,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...