探究字符串匹配算法:暴力法与KMP算法的Java实现
探究字符串匹配算法:暴力法与KMP算法的Java实现
字符串匹配是计算机科学中的基本问题之一,它涉及在一个主串中查找特定的子串。在本文中,我们将深入探讨暴力法和KMP算法这两种常见的字符串匹配算法,并提供详细的Java代码示例。
1. 暴力法(Brute Force)
概念:暴力法是一种简单直观的字符串匹配算法。它在主串中逐个位置尝试匹配子串,如果匹配失败则将主串和子串的索引向后移动一位。
代码示例:
public class BruteForceMatcher {public static int bruteForceSearch(String text, String pattern) {int n = text.length();int m = pattern.length();for (int i = 0; i <= n - m; i++) {int j = 0;while (j < m && text.charAt(i + j) == pattern.charAt(j)) {j++;}if (j == m) {return i; // 匹配成功,返回索引}}return -1; // 未找到匹配}public static void main(String[] args) {String text = "ABABABAABCABAB";String pattern = "ABC";int index = bruteForceSearch(text, pattern);if (index != -1) {System.out.println("在索引 " + index + " 处找到匹配。");} else {System.out.println("未找到匹配。");}}
}
2. KMP算法
概念:KMP算法是一种高效的字符串匹配算法,它利用已经匹配过的信息来减少比较次数。它构建了一个部分匹配表(也称为最长前缀后缀表),用于在匹配过程中指导主串和子串的移动。
代码示例:
public class KMPMatcher {public static int[] computePrefixTable(String pattern) {int m = pattern.length();int[] prefixTable = new int[m];int j = 0;for (int i = 1; i < m; i++) {while (j > 0 && pattern.charAt(i) != pattern.charAt(j)) {j = prefixTable[j - 1];}if (pattern.charAt(i) == pattern.charAt(j)) {j++;}prefixTable[i] = j;}return prefixTable;}public static int kmpSearch(String text, String pattern) {int n = text.length();int m = pattern.length();int[] prefixTable = computePrefixTable(pattern);int j = 0;for (int i = 0; i < n; i++) {while (j > 0 && text.charAt(i) != pattern.charAt(j)) {j = prefixTable[j - 1];}if (text.charAt(i) == pattern.charAt(j)) {j++;}if (j == m) {return i - m + 1; // 匹配成功,返回索引}}return -1; // 未找到匹配}public static void main(String[] args) {String text = "ABABABAABCABAB";String pattern = "ABC";int index = kmpSearch(text, pattern);if (index != -1) {System.out.println("在索引 " + index + " 处找到匹配。");} else {System.out.println("未找到匹配。");}}
}
本文深入探讨了暴力法和KMP算法这两种常见的字符串匹配算法。通过详细的Java代码示例和解释,我们希望您能更好地理解这些算法的原理和应用。
相关文章:
探究字符串匹配算法:暴力法与KMP算法的Java实现
探究字符串匹配算法:暴力法与KMP算法的Java实现 字符串匹配是计算机科学中的基本问题之一,它涉及在一个主串中查找特定的子串。在本文中,我们将深入探讨暴力法和KMP算法这两种常见的字符串匹配算法,并提供详细的Java代码示例。 …...
前端面试:【浏览器与渲染引擎】工作原理与渲染流程
嗨,亲爱的读者!你是否曾经好奇过当你在浏览器中输入URL并按下回车时,网页是如何显示在你的屏幕上的?这背后涉及了复杂的浏览器工作原理和渲染流程。本文将带你深入了解浏览器如何工作以及网页如何被渲染出来。 1. 浏览器的工作原理…...
PySide6学习笔记--gui小模版使用
一、界面绘制 1.desiner画图 2.画图代码 # -*- coding: utf-8 -*-################################################################################ ## Form generated from reading UI file t1gui.ui ## ## Created by: Qt User Interface Compiler version 6.5.2 ## ##…...
如何用Python实现冒泡排序
1 问题 冒泡排序是一种简单的排序算法,它也是一种稳定排序算法。其实现原理是重复扫描待排序序列,并比较每一对相邻的元素,当该对元素顺序不正确时进行交换。一直重复这个过程,直到没有任何两个相邻的元素可以交换,就表…...
C++Qt堆叠窗体的使用案例
本博文源于笔者最近学习的Qt,内容讲解堆叠窗体QStackedWidget案例,效果是选择左侧列表框中不同的选项时,右侧显示所选的不同的窗体。 案例效果 案例书写过程 控件都是动态创建的,因此.h文件需要创建控件,.cpp书写业务…...
Linux之套接字UDP实现网络通信
Linux之套接字UDP实现网络通信 文章目录 Linux之套接字UDP实现网络通信1.引言2.具体实现2.1需要知道的套接字接口1.socket()2.bind()3.recvfrom()4.sendto() 2.2服务器端server.hpp2.3服务器端server.cc2.4客户端Client.cc 1.引言 套接字(Socket)是计算机网络中实现网络通信…...
Matlab绘制二值图像
二值化介绍 只有黑白两种颜色的图像称为黑白图像或单色图像,是指图像的每个像素只能是黑或者白,没有中间的过渡,故又称为二值图像。其特点是二值图像的像素值只能为0和1,分别代表黑色和白色,图像中的每个像素值用1位存…...
Kali 网络参数的配置
手工方式 Wired 有线 Woreless 无线 图形化的网络管理器(依赖的服务:NetworkManager) ┌──(root㉿kali)-[~] └─# systemctl status NetworkManager ● NetworkManager.service - Network ManagerLoaded: loaded (/lib/systemd/system/N…...
在 Redis 中处理键值 | Navicat
Redis 是一个键值存储系统,允许我们将值与键相关联起来。与关系型数据库不同的是, 在Redis 中,不需要使用数据操作语言 (DML) 和查询语法,那么我们如何进行数据的写入、读取、更新和删除操作呢?…...
RedisTemplate和StringRedisTemplate的区别、对比
学习 Jedis、RedisTemplate、StringRedisTemplate之间的比较 博客中提到:一. Jedis是Redis官方推荐的面向Java的操作Redis的客户端。 二. RedisTemplate,StringRedisTemplate是SpringDataRedis中对JedisApi的高度封装。SpringDataRedis相对于Jedis来说可以方便地更…...
使用ChatGPT进行创意写作的缺点
Open AI警告ChatGPT的使用者要明白此工具的局限性,更不应完全依赖。作为一位创作者,这一点非常重要,应尽可能地避免让版权问题或不必要的文体问题出现在自己的作品中。[1] 毕竟使用ChatGPT进行创意写作目前还有以下种种局限或缺点[2]…...
七、任务优先级和Tick
1、任务与中断的优先级 (1)相同优先级任务轮流执行。 (2)高优先级任务打断低优先级任务。 (3)中断可以打断所有优先级的任务。 2、任务优先级 (1)优先级的取值范围是:0~(configMAX_PRIORITIES – 1),数值越大优先级越高。 (2)FreeRTOS会确保最高优…...
Python——三目运算语句
本文基于python3。 目录 1、三目运算语句的定义2、三目运算语句:包含逻辑运算符 (and、or、not)1、 包含 and2、包含 or3、包含 not4、包含 and、or、not 3、三目运算语句:使用多个if ... else ...形式4、三目运算语句:在列表(li…...
C 实现Window/DOS 键盘监听事件
今天是重新复习C语言实现的第一天,今天想编写C 对Windwos/Dos 键盘事件的学习。但是我在安装Visual Studio 2022 没有安装MFC 框架,今天记录下VS追加 MFC框架。 Visual Studio 2022 追加MFC 1、打开vs,点击创建新项目,右侧滑动框…...
在vue中使用 axios 访问 API
Vue 不像 jQuery 内置了 ajax 请求函数,在 Vue 中没有提供这样的功能。所以当我们需要在 Vue 中和服务端进行通信的时候可选择的方式会更灵活一些。 所以 Vue 给了我们更多的选择空间,例如我们可以使用下面的可选方案: 原生的 XMLHttpReques…...
java八股文面试[java基础]——浅拷贝和深拷贝
自验证:创建Class Student两个类, Student中含有Class对象 public class Class implements Cloneable {public String getName() {return name;}public void setName(String name) {this.name name;}private String name;public Class(String name) {t…...
【DC-DC的原理图及Layout设计要点】
文章目录 前言1.DC-DC的环流2.PCB布局要点3.输入电容器的布局4.续流二极管的布局5.热焊盘 前言 在开关电源的设计中,PCB布局设计与电路设计同样重要。合理的布局可以避免电源电路引起的各种问题。不合理的布局可能导致输出和开关信号叠加引起噪声增加、调节性能恶化…...
TCP可靠性机制
确认号/序列号/ACK TCP帮助确保数据的准确传递。为了做到这一点,其使用了一些特殊的标记和信息,其中包括序号、确认号和ACK字段。 其中,它将每个字节的数据都进行了编号. 即为序列号. 序列号:就像给书中的每一页都编了号码一样&a…...
solidity0.8.0的应用案例13:数字签名及应用:NFT白名单
以太坊中的数字签名ECDSA,以及如何利用它发放NFT白名单 代码中的ECDSA库由OpenZeppelin的同名库简化而成。 数字签名 如果你用过opensea交易NFT,对签名就不会陌生。下图是小狐狸(metamask)钱包进行签名时弹出的窗口,它可以证明你拥有私钥的同时不需要对外公布私钥。 …...
视频集中存储/直播点播平台EasyDSS内核无法启动是什么原因?
视频推拉流EasyDSS视频直播点播平台,集视频直播、点播、转码、管理、录像、检索、时移回看等功能于一体,可提供音视频采集、视频推拉流、播放H.265编码视频、存储、分发等视频能力服务。 有用户反馈,下载了视频直播点播平台EasyDSS最新版本&a…...
【网络】DNS | ICMP | NAT | 代理服务器
🐱作者:一只大喵咪1201 🐱专栏:《网络》 🔥格言:你只管努力,剩下的交给时间! 前面几篇文章虽然讲介绍了整个网络通信的协议栈,我们也知道了完整的网络通信过程ÿ…...
详细手机代理IP配置
嗨,亲爱的朋友们!作为一家代理产品供应商,我知道有很多小伙伴在使用手机进行网络爬虫和数据采集时,常常会遇到一些IP限制的问题。别担心!今天我要给大家分享一下手机IP代理的设置方法,让你们轻松应对这些限…...
【C++】—— 简述C++11新特性
序言: 从本期开始,我将会带大家学习的是关于C11 新增的相关知识!废话不多说,我们直接开始今天的学习。 目录 (一)C11简介 (二)统一的列表初始化 1、{}初始…...
协议的分层结构
1.1TCP/IP 协议 为了使各种不同的计算机之间可以互联,ARPANet指定了一套计算机通信协议,即TCP/IP 协议(族). 注意TCP /IP 协议族指的不只是这两个协议 而是很多协议, 只要联网的都使用TCP/IP协议族 为了减少 协议设计的复杂度 ,大…...
Linux下彻底卸载jenkins
文章目录 1、停服务进程2、查找安装目录3、删掉相关目录4、确认已完全删除 1、停服务进程 查看jenkins服务是否在运行,如果在运行,停掉 ps -ef|grep jenkins kill -9 XXX2、查找安装目录 find / -name "jenkins*"3、删掉相关目录 # 删掉相…...
Nebula基础的查询操作介绍
Nebula基础的查询操作介绍 这里只是对Nebula基础查询进行介绍,其目的是为了让未接触过Nebula的同学最短时间了解其语句。更详细更准确的内可以查看官方文档。 docs.nebula-graph 关于查询这里并没有使用官方例子数据,而是自己实际尝试了文档中的语句。 …...
C++ STL序列式容器(详解)
STL基础 C STL基本组成(6大组件13个头文件) 通常认为,STL 是由容器、算法、迭代器、函数对象、适配器、内存分配器这 6 部分构成,其中后面 4 部分是为前 2 部分服务的,它们各自的含义如表 1 所示。 表 1 STL 组成…...
C++获取map最小值算法,STL---std::min_element()!
std::min_element 定义于头文件 <algorithm> 以下是API文档说明! 寻找范围 [first, last) 中的最小元素。 1) 用 operator< 比较元素。 3) 用给定的二元比较函数 comp 比较元素。 2,4) 同 (1,3) ,但按照 policy 执行。这些重载仅若 std::is…...
如何在Java实现TCP方式发送和接收Socket消息(多线程模式)
目录 导言:正文:1. 创建Server端:2. 创建Client端:3. 多线程模式: 代码示例Server端代码示例:Client端代码示例:同步模式发送TCP消息异步模式 结论: 导言: 在Java编程中…...
SYBASE查询全量字段及对应的表名方法
SELECT COLUMN_name,table_name,user_type,COLUMN_type,width FROM syscolumn a,systable b WHERE a.table_idb.table_id AND COLUMN_name...
网站建设流程 文档/seo培训学什么
Bootstrap是最广泛采用的开源前端框架之一。 将Bootstrap包含在您的项目中,您将能够立即生成响应式网页。 如果您尝试将Masonry与Bootstrap Tabs小部件(Bootstrap必须提供的众多JavaScript组件之一)一起使用,那么您可能会偶然发现…...
有没有做兼职的网站/刷神马网站优化排名
nginx默认配置文件 nginx.conf 介绍: 全局配置user nginx;设置nginx服务的系统使用用户worker_processes 1;工作进程数(建议和CPU核心数保持一致) error_log /var/log/nginx/error.log warn;错误日志。 warn代表级别pid /var/run/…...
做电池网站的引导页/百度浏览器下载安装2023版本
2019独角兽企业重金招聘Python工程师标准>>> Fiddler绝对称得上是"抓包神器", Fiddler不但能截获各种浏览器发出的HTTP请求, 也可以截获各种智能手机发出的HTTP/HTTPS请求。 Fiddler能捕获ISO设备发出的请求,比如IPhone, IPad, Mac…...
深圳做网站价比高的公司性/怎样注册自己的网站
思科提供了许多处理连接性的方法,这使得排除的故障和解决问题成为一个并不轻松的问题。从包括在某些思科路由器中的性能到PIX防火墙所提供的服务,再到思科的 Concentrator,其中的每一个都有其自身的特点。 考虑到选项的复杂性,本…...
重庆活动轨迹公布/权威seo技术
前言可能很多小伙伴们都知道,在一般互联企业初期大多数都是采用手工打包上传与发布的方式进行代码发布,常见就是利用打包工具手工打包,上传到WEB服务器,备份原代码文件,发布新的代码,重启服务和检测是否发布…...
wordpress term id/苏州网站建设书生商友
系统装的RED HAT LINUX 9 装为服务器类别 只选装了English语言支持 装好之后 用 SSH SECURE SHELL 连接到系统,发现打开有些文档里有乱码 ,而在系统本身却没有,于是修改/etc/systemconfig/i18n这个文件,在最后加入一行LC_ALLPOSIX,重启系统,再也没有乱码了 .转载于:https://bl…...