【JavaScript 算法】KMP算法:高效的字符串匹配

在这里插入图片描述

🔥 个人主页:空白诗

在这里插入图片描述

文章目录

    • 一、算法原理
      • 部分匹配表的构建
    • 二、算法实现
      • 构建部分匹配表
      • KMP字符串匹配
      • 注释说明:
    • 三、应用场景
    • 四、总结

在这里插入图片描述

KMP算法(Knuth-Morris-Pratt Algorithm)是一种用于在文本中高效查找子串的字符串匹配算法。它通过预处理模式字符串,构建部分匹配表(又称为失配表),在匹配过程中避免重复扫描,从而提高匹配效率。本文将详细介绍KMP算法的原理、实现及其应用。


一、算法原理

KMP算法的核心思想是在匹配过程中利用已经匹配的部分信息来避免重复匹配。其主要步骤如下:

  1. 构建部分匹配表:对于模式字符串中的每个位置,计算在该位置之前的子串的最大前缀和后缀的长度。
  2. 字符串匹配:利用部分匹配表,在文本中查找模式字符串,如果发生失配,根据部分匹配表跳过一定的字符,而不是逐个字符地重新匹配。
开始
构建部分匹配表
初始化指针
字符是否匹配?
根据部分匹配表更新指针
指针前进
模式字符串匹配完成?
返回匹配位置
结束

部分匹配表的构建

部分匹配表记录了每个位置之前的子串的最大前缀和后缀的长度,用于在发生失配时跳过重复匹配的字符。


二、算法实现

构建部分匹配表

/*** 构建部分匹配表* @param {string} pattern - 模式字符串* @return {number[]} - 部分匹配表*/
function buildPartialMatchTable(pattern) {const m = pattern.length;const table = Array(m).fill(0);let j = 0;for (let i = 1; i < m; i++) {while (j > 0 && pattern[i] !== pattern[j]) {j = table[j - 1];}if (pattern[i] === pattern[j]) {j++;}table[i] = j;}return table;
}// 示例
const pattern = "ABABC";
const partialMatchTable = buildPartialMatchTable(pattern);
console.log(partialMatchTable); // 输出: [0, 0, 1, 2, 0]

KMP字符串匹配

/*** KMP字符串匹配算法* @param {string} text - 文本字符串* @param {string} pattern - 模式字符串* @return {number} - 模式字符串在文本中的起始位置,未找到返回 -1*/
function kmpSearch(text, pattern) {const n = text.length;const m = pattern.length;const table = buildPartialMatchTable(pattern);let j = 0;for (let i = 0; i < n; i++) {while (j > 0 && text[i] !== pattern[j]) {j = table[j - 1];}if (text[i] === pattern[j]) {j++;}if (j === m) {return i - m + 1; // 匹配成功,返回起始位置}}return -1; // 未找到匹配
}// 示例
const text = "ABABDABACDABABCABAB";
const result = kmpSearch(text, pattern);
console.log(result); // 输出: 10

注释说明:

  1. 构建部分匹配表

    • buildPartialMatchTable(pattern):构建模式字符串的部分匹配表,返回一个数组,记录每个位置之前的子串的最大前缀和后缀的长度。
    • let j = 0;:初始化前缀长度。
    • for (let i = 1; i < m; i++):遍历模式字符串,从第二个字符开始。
    • while (j > 0 && pattern[i] !== pattern[j]):如果字符不匹配,更新前缀长度。
    • if (pattern[i] === pattern[j]):如果字符匹配,前缀长度加1。
    • table[i] = j;:更新部分匹配表。
  2. KMP字符串匹配

    • kmpSearch(text, pattern):在文本字符串中查找模式字符串,返回模式字符串在文本中的起始位置,未找到返回-1。
    • const table = buildPartialMatchTable(pattern);:构建模式字符串的部分匹配表。
    • for (let i = 0; i < n; i++):遍历文本字符串。
    • while (j > 0 && text[i] !== pattern[j]):如果字符不匹配,更新前缀长度。
    • if (text[i] === pattern[j]):如果字符匹配,前缀长度加1。
    • if (j === m):如果前缀长度等于模式字符串长度,表示匹配成功,返回起始位置。

三、应用场景

  1. 字符串查找:在大文本中查找模式字符串的位置。
  2. 文本编辑器:实现文本编辑器中的查找和替换功能。
  3. DNA序列分析:在DNA序列中查找特定的基因序列。
  4. 数据挖掘:在数据挖掘中查找特定的模式。

四、总结

KMP算法是一种高效的字符串匹配算法,通过构建部分匹配表,在匹配过程中避免重复扫描,从而提高匹配效率。理解和掌握KMP算法,可以有效解决字符串匹配问题,广泛应用于字符串查找、文本编辑、DNA序列分析和数据挖掘等领域。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/48245.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

昇思学习打卡-21-生成式/Diffusion扩散模型

文章目录 Diffusion扩散模型介绍模型推理结果 Diffusion扩散模型介绍 关于扩散模型&#xff08;Diffusion Models&#xff09;有很多种理解&#xff0c;除了本文介绍的离散时间视角外&#xff0c;还有连续时间视角、概率分布转换视角、马尔可夫链视角、能量函数视角、数据增强…

【BUG】已解决:AttributeError: ‘DataFrame‘ object has no attribute ‘append‘

已解决&#xff1a;AttributeError: ‘DataFrame‘ object has no attribute ‘append‘ 目录 已解决&#xff1a;AttributeError: ‘DataFrame‘ object has no attribute ‘append‘ 【常见模块错误】 错误原因&#xff1a; 解决办法&#xff1a; 欢迎来到英杰社区https:/…

215. 数组中的第K个最大元素 347. 前 K 个高频元素(LeetCode热题100)

215. 数组中的第K个最大元素 - 力扣&#xff08;LeetCode&#xff09; 写个快排&#xff0c;使数组升序&#xff0c;返回倒数第k个元素即可 func quickSort(nums []int, l int, r int) {if l > r {return}x : nums[(l r) / 2]i : l - 1j : r 1for i < j {for {iif n…

[力扣Java解题分享]12.74搜索二维矩阵

给你一个满足下述两条属性的 m x n 整数矩阵&#xff1a; 每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target &#xff0c;如果 target 在矩阵中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。…

大鲸鱼docker-compose单机容器集群编排工具

目录 一、Docker-compose 概述 二、Docker-compose简介 三、YML文件格式及编写注意事项 1.yml文件是什么 2.yml问价使用注意事项 3.yml文件的基本数据结构 四、Docker-compose 配置 1.Docker-Compose 配置常用字段 2.Docker Compose常用命令 3.使用Docker-compose创建…

【笔记:3D航路规划算法】一、随机搜索锚点(python实现,讲解思路)

目录 关键概念3D路径规划算法1. A*算法2. 快速随机锚点1. 初始化&#xff1a;2. 实例化搜索算法&#xff1a;3. 路径生成&#xff1a;4. 绘制图像&#xff1a; 3D路径规划是在三维空间中寻找从起点到终点的最短或最优路径的一种技术。它广泛应用于无人机导航、机器人运动规划、…

蓝牙新篇章:WebKit的Web Bluetooth API深度解析

蓝牙新篇章&#xff1a;WebKit的Web Bluetooth API深度解析 在物联网(IoT)时代&#xff0c;Web应用与物理设备的交互变得越来越重要。WebKit的Web Bluetooth API开启了一个新时代&#xff0c;允许Web页面直接与蓝牙设备通信。这一API不仅提高了用户体验&#xff0c;还为创新的…

Python爬虫——1爬虫基础(一步一步慢慢来)

一、爬虫是什么&#xff1f; &#xff08;spider&#xff09; Python 爬虫是利用编程语言 Python 来获取互联网上的数据的技术。它可以自动化地访问网页、提取信息并进行数据处理。以下是Python爬虫的基础知识和步骤&#xff1a; 主要特点和功能&#xff1a; 自动化浏览&#…

【医学影像】X86+FPGA:支持AI医学影像设备应用的工控主板,赋能CT、MRI、X线、超声等医学影像设备

支持AI医学影像设备应用的工控主板 在我国人口老龄化问题不断加剧&#xff0c;对影像诊断需求持续增长&#xff0c;和国家利好高端医学影像市场发展的系列法规和政策接连出台的大环境下&#xff0c;AI医学影像设备产业迎来发展黄金期。紧跟发展大势&#xff0c;基于12/13代 In…

开放开源开先河(三)

伴随开源生态快速发展壮大、开源项目数量爆发式增长的是国家层面对开源的鼓励和推动。2020被业界称为开源爆发年&#xff0c;本年度的“木兰协议”正式成为国际化开源许可证&#xff0c;工信部联合全球知名开源平台Gitee建设中国独立的开源托管平台。2021年3月&#xff0c;开源…

Federated Graph Augmentation for Semisupervised Node Classification

文章目录 1 本文的主要贡献2 FedGA 模型3 FedGA-L 模型3.1 模型的思想3.2 模型具体步骤 4 实验 1 本文的主要贡献 解决图联邦学习中利用图拓扑结构和无标签节点数据的难题&#xff0c;提出了一种称为联合图增强(FedGA)的新方法&#xff0c;以更好地利用拓扑信息&#xff0c;然…

试编写函数fun的功能是:为一个偶数寻找两个素数,这两个素数之和等于该偶数,并将这两个素数通过形参指针传回主函数。

代码如下&#xff1a; #include <stdio.h> #include <math.h> void fun(int a, int *b, int *c) { int i,j,d,y;for (i3;i<a/2;ii2){y1; //y为标志变量for (j2;j<sqrt((double)i );j)if (i%j0) y0;if (y1){da-i; for (j2;j<sqrt((double)d );j)…

03Spring底层架构核心概念解析

为了感谢罕哥对我工作的帮助&#xff0c;特此记录下学习过程&#xff0c;期待成为和罕哥一样优秀的人 时间&#xff1a;2024.7.13 内容&#xff1a;spring源码课程3学习记录 一、BeanDefinition BeanDefinition表示Bean的定义&#xff0c;BeanDefinition中存在很多属性用来…

【python学习】python的知识点总结、特点和思考及解答(代码示例)

引言 python 是一种高级编程语言&#xff0c;具有简洁的语法和丰富的库&#xff0c;被广泛应用于Web开发、数据分析、人工智能、科学计算等领域 文章目录 引言一、python知识点总结1.1 基础语法1.1.1 变量和数据类型1.1.2 控制结构1.1.3 函数和模块 1.2 面向对象编程1.2.1 类和…

Linux CAN数据收发

在Linux环境下&#xff0c;使用SocketCAN进行CAN消息的发送和接收通常涉及到socket编程。 写了一个简单的示例&#xff0c;展示了如何实现CAN消息的发送&#xff08;tx&#xff09;和接收&#xff08;rx&#xff09;函数。 1. 包含必要的头文件 #include <stdio.h> …

如何通过成熟的外发平台,实现文档安全外发管理?

文档安全外发管理是企业信息安全管理的重要组成部分&#xff0c;它涉及到企业向外发送的文件&#xff0c;需要进行严格的控制和管理&#xff0c;防止敏感或机密信息的泄露。以下是一些关键考虑因素&#xff1a; 文件外发的挑战&#xff1a;企业在文件外发时面临的主要挑战包括…

Windows 电脑装机软件推荐

1.系统辅助&#xff1a; https://github.com/microsoft/PowerToys/releases 2.下载工具&#xff1a; Motrix

wls2下的centos使用桥接模式连接宿主机网络独立静态ip

前提&#xff1a;wsl2已安装&#xff0c;可正常更新 1.在控制面板中&#xff0c;打开开启或关闭windows功能&#xff0c;将里面的 Hyper-V功能打开&#xff0c;此处涉及重启 2. 按一下win键&#xff0c;输入hy&#xff0c;上面可以看到Hyper-V Manager,点进去 3.选择右边的 Vi…

Fiddler抓包

一个不错的文档&#xff1a;萌新要入行-CSDN博客 测试之路&#xff1a;3年经验来面试20K的测试岗&#xff0c;连基本功都不会&#xff0c;还不如去招应届生 Fiddler教程&#xff1a;https://www.cnblogs.com/zhangyangcheng/articles/15218175.html Fiddler安装教程&#xff1…

为什么Spring选择使用容器来管理对象,而不是直接使用new

为什么Spring选择使用容器来管理对象&#xff0c;而不是直接使用new 在Java应用程序开发中&#xff0c;对象的创建和管理是一项基础且关键的任务。传统上&#xff0c;开发者习惯于使用new关键字直接在代码中实例化对象。然而&#xff0c;随着应用程序规模的扩大和复杂度的增加…