JavaScript中数据结构与算法(四):串(BF)

在计算机科学中,一个串是一种有序的字符序列,也称为字符串。在前端开发中,我们经常需要处理字符串,比如对用户输入的文本进行校验或提取其中的关键信息。了解串的基础知识和常用算法可以帮助我们更好地处理字符串。

串的朴素匹配算法(BF)

串的朴素匹配算法(Brute-Force Algorithm),也称为暴力匹配算法,是最简单直观的字符串匹配算法。该算法从目标串的第一个字符开始扫描,逐个比较目标串和模式串的每个字符是否相等,如果不同则继续扫描下一个位置,直到找到匹配的子串或者目标串扫描完毕。

以下是朴素匹配算法的 JavaScript 实现:

-------- ---------------- -------- -
  ----- - - --------------
  ----- - - ---------------
  --- ---- - - -- - -- - - -- ---- -
    --- - - --
    ----- -- - - -- -------- - -- --- ----------- -
      ----
    -
    -- -- --- -- -
      ------ --
    -
  -
  ------ ---
-

上述实现中,bfSearch 函数接收两个参数,分别表示目标串和模式串。函数首先获取目标串和模式串的长度,然后从目标串的第一个字符开始遍历,对于每个位置,都逐个比较目标串和模式串的字符是否相等。如果找到了匹配的子串,则返回该子串在目标串中的起始位置,否则返回 -1。

朴素匹配算法的时间复杂度为 O(n * m),其中 n 和 m 分别表示目标串和模式串的长度。由于需要对每个位置进行全匹配,因此该算法的效率较低,适用于字符串较短或者匹配要求不严格的场景。

串的KMP算法

KMP算法是一种高效的字符串匹配算法,它采用了不回溯的方式进行匹配。该算法首先预处理模式串,构建一个部分匹配表(Partial Match Table),然后在匹配目标串时根据部分匹配表直接跳过已经匹配过的前缀,避免重复匹配。

以下是KMP算法的JavaScript实现:

-------- ----------------- -------- -
  ----- - - --------------
  ----- - - ---------------
  ----- ---- - -----------------
  --- - - --
    - - --
  ----- -- - - -- - - -- -
    -- -- --- -- -- --------- --- ----------- -
      ----
      ----
    - ---- -
      - - --------
    -
  -
  -- -- --- -- -
    ------ - - --
  - ---- -
    ------ ---
  -
-

-------- ---------------- -
  ----- - - ---------------
  ----- ---- - --- ---------
  --- - - --
    - - ---
  ------- - ---
  ----- -- - - - -- -
    -- -- --- -- -- ---------- --- ----------- -
      ----
      ----
      ------- - --
    - ---- -
      - - --------
    -
  -
  ------ -----
-

上述实现中,kmpSearch 函数调用了 getNext 函数来获取模式串的部分匹配表。具体实现过程如下:

  1. 初始化 next[0] = -1i=0j=-1
  2. 对于每个 i,计算对应的 next[i] 值。如果 j=-1

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/3410