前端與算法 leetcode 28.實現 strStr()

前端與算法 leetcode 28.實現 strStr()


題目描述

28.移除元素javascript

概要

這道題的意義是實現一個api,不是調api,儘管不少時候api的速度比咱們寫的快(今天這個咱們能夠作到和indexOf同樣快),但咱們仍是要去了解api內實現的原理,在咱們所熟悉的v8引擎中,indexOf使用了kmp和bm兩種算法,在主串長度小於7時使用kmp,大於7的時候使用bm,bf咱就不說了哈,那個其實就是爆破算法,前端

提示

數據結構,kmp,bmjava

解析

kmp算法的核心其實就是動態規劃,明確了next數組的含義,就能知道該如何推算了,關於KMP算法的解析已經爛大街了,隨便一搜就能得到一大把,認真看看就能知道原理了,有空的話,建議手推幾遍,有助於加深記憶(背題並不可恥,真的)算法

算法

經典算法的js實現api

/**  * @param {string} haystack  * @param {string} needle  * @return {number}  */
const strStr = (haystack, needle) => {
  if (needle === ''return 0
  let [i, j] = [00]
  const next = []
  const nextfuc = (p, next) => {
    next[0] = -1
    let [j, k] = [0-1]
    while (j < p.length - 1) {
      if (k === -1 || p[j] === p[k]) {
        if (p[++j] === p[++k]) {
          next[j] = next[k]
        } else {
          next[j] = k
        }
      } else {
        k = next[k]
      }
    }
  }
  nextfuc(needle, next)
  while (i < haystack.length && j < needle.length) {
    if (j === -1 || haystack[i] === needle[j]) {
      i++
      j++
    } else {
      j = next[j]
    }
  }
  if (j === needle.length) {
    return i - j
  } else {
    return -1
  }
}


複製代碼

傳入aacabcaacdaacd的運行結果數組

6
複製代碼

執行結果數據結構

執行用時 :60 ms, 在全部 javascript 提交中擊敗了95.66% 的用戶
內存消耗 :33.7 MB, 在全部 javascript 提交中擊敗了33.58%的用戶
複製代碼
相關文章
相關標籤/搜索