前端与算法 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%的用户

前端与算法 leetcode 28.实现 strStr()的更多相关文章

  1. 前端与算法 leetcode 242. 有效的字母异位词

    目录 # 前端与算法 leetcode 242. 有效的字母异位词 题目描述 概要 提示 解析 解法一:哈希表 解法二:数组判断字符出现次数 解法三:转换字符串 算法 传入测试用例的运行结果 执行结果 ...

  2. 前端与算法 leetcode 26. 删除排序数组中的重复项

    目录 # 前端与算法 leetcode 26. 删除排序数组中的重复项 题目描述 概要 提示 解析 算法 # 前端与算法 leetcode 26. 删除排序数组中的重复项 题目描述 26. 删除排序数 ...

  3. 前端与算法 leetcode 350. 两个数组的交集 II

    目录 # 前端与算法 leetcode 350. 两个数组的交集 II 题目描述 概要 提示 解析 解法一:哈希表 解法二:双指针 解法三:暴力法 算法 # 前端与算法 leetcode 350. 两 ...

  4. 前端与算法 leetcode 283. 移动零

    目录 # 前端与算法 leetcode 283. 移动零 题目描述 概要 提示 解析 解法一:暴力法 解法二:双指针法 算法 传入[0,1,0,3,12]的运行结果 执行结果 GitHub仓库 # 前 ...

  5. 前端与算法 leetcode 1. 两数之和

    目录 # 前端与算法 leetcode 1. 两数之和 题目描述 概要 提示 解析 解法一:暴力法 解法二:HashMap法 算法 传入[1, 2], [11, 1, 2, 3, 2]的运行结果 执行 ...

  6. 前端与算法 leetcode 48. 旋转图像

    目录 # 前端与算法 leetcode 48. 旋转图像 题目描述 概要 提示 解析 解法一:转置加翻转 解法二:在单次循环中旋转 4 个矩形 算法 传入测试用例的运行结果 执行结果 GitHub仓库 ...

  7. 前端与算法 leetcode 7. 整数反转

    目录 # 前端与算法 leetcode 7. 整数反转 题目描述 概要 提示 解析 解法 算法 传入测试用例的运行结果 执行结果 GitHub仓库 # 前端与算法 leetcode 7. 整数反转 题 ...

  8. 前端与算法 leetcode 8. 字符串转换整数 (atoi)

    目录 # 前端与算法 leetcode 8. 字符串转换整数 (atoi) 题目描述 概要 提示 解析 解法一:正则 解法二:api 解法二:手搓一个api 算法 传入测试用例的运行结果 执行结果 G ...

  9. 前端与算法 leetcode 387. 字符串中的第一个唯一字符

    目录 # 前端与算法 leetcode 387. 字符串中的第一个唯一字符 题目描述 概要 提示 解析 解法一:双循环 解法二:Set法单循环 算法 传入测试用例的运行结果 执行结果 GitHub仓库 ...

随机推荐

  1. Laravel 解决blade模板转义html标签问题

    当我们使用富文本编译器(如:Ueditor编译器)保存编辑的内容后,在blade模板中,想要显示原生的html标签内容时该怎么做? 首先,了解下laravel {{ 变量名 }} 与{!! 变量名 ! ...

  2. 少女NULL中

    NULL inline void read (int &now) { register ; ; !isdigit (word); word = getchar ()) ; + word - ' ...

  3. SP5971 LCMSUM 数论

    题面 题目要我们求这个: \[\sum_{i=1}^n lcm(i,n)\] 开始化式子: \[\sum_{i=1}^{n} \frac{i*n}{gcd(i,n)}\] \[\sum_{d|n} \ ...

  4. PHP Record the number of login users

    Function to record how many times the user logs in Connect to the database first: you can create a n ...

  5. Eureka 的高级使用

    基础架构Eureka架构中的三个核心角色: 服务注册中心 Eureka的服务端应用,提供服务注册和发现功能,就是刚刚我们建立的eureka-demo 服务提供者 提供服务的应用,可以是SpringBo ...

  6. zabbix监控ESXI主机

    ESXI6.0默认SSH关闭的,打开SSH的方法如下图: SSH打开后,主机会有警报,关闭警报的方法如下图 esxcli system  snmp  set  --communities  publi ...

  7. vue中axios使用一:axios做拦截器

    转载请注明出处: 项目中用到了单点登录,依赖的公司通用的jar包,且项目为前后端分离的方式,为了管理系统的所有请求和 超时管理,用到了axios,做前端请求拦截,并做管理. 其有以下特点: axios ...

  8. openwrt如何打开linux内核的CONFIG_DEVMEM选项?

    答: 直接在openwrt的make menuconfig中打开CONFIG_KERNEL_DEVMEM选项即可

  9. Error-ASP.NET:此 SqlTransaction 已完成;它再也无法使用。

    ylbtech-Error-ASP.NET:此 SqlTransaction 已完成:它再也无法使用.  1.返回顶部 1. “/”应用程序中的服务器错误. 此 SqlTransaction 已完成: ...

  10. PHP商品秒杀问题解决方案实例详解【mysql与redis】

    本文实例讲述了PHP商品秒杀问题解决方案.分享给大家供大家参考,具体如下: 引言 假设num是存储在数据库中的字段,保存了被秒杀产品的剩余数量. if($num > 0){ //用户抢购成功,记 ...