• 前端与算法 leetcode 28.实现 strStr()


    前端与算法 leetcode 28.实现 strStr()


    题目描述

    28.移除元素

    概要

    这道题的意义是实现一个api,不是调api,尽管很多时候api的速度比我们写的快(今天这个我们可以做到和indexOf一样快),但我们还是要去了解api内实现的原理,在我们所熟悉的v8引擎中,indexOf使用了kmp和bm两种算法,在主串长度小于7时使用kmp,大于7的时候使用bm,bf咱就不说了哈,那个其实就是爆破算法,

    提示

    数据结构,kmp,bm

    解析

    kmp算法的核心其实就是动态规划,明确了next数组的含义,就能知道该如何推算了,关于KMP算法的解析已经烂大街了,随便一搜就能获得一大把,认真看看就能知道原理了,有空的话,建议手推几遍,有助于加深记忆(背题并不可耻,真的)

    算法

    经典算法的js实现

    /**
     * @param {string} haystack
     * @param {string} needle
     * @return {number}
     */
    const strStr = (haystack, needle) => {
      if (needle === '') return 0
      let [i, j] = [0, 0]
      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%的用户
    
  • 相关阅读:
    Nginx+Keepalived(双机热备)搭建高可用负载均衡环境(HA)
    库管理系统-- 后台管理开源啦,源码大放送
    .NET Core R2
    Linux gdb调试
    webpack React+ES6
    绿卡排队
    ABP分层设计
    vscode编写插件
    控制台程序的参数解析类库 CommandLine
    Net Core MVC6 RC2 启动过程分析
  • 原文地址:https://www.cnblogs.com/moshuying/p/11736194.html
Copyright © 2020-2023  润新知