C#实现KMP算法,在长字符串中找到第一个符合要求的子字符串

KMP(Knuth-Morris-Pratt)算法是一种高效的字符串搜索算法,它可以在一个文本字符串(Text)中搜索一个词(Pattern),时间复杂度为O(n+m),其中n是文本字符串的长度,m是词的长度。下面是一个C#实现KMP算法的示例:

using System;public class KMPAlgorithm
{// KMP算法中的部分匹配表(也称为失效函数或跳转表)private static int[] ComputeLPSArray(string pattern, int M, int[] lps){int len = 0; // 长度初始化int i = 1;lps[0] = 0; // lps[0] 总是0// 填充lps[]数组while (i < M){if (pattern[i] == pattern[len]){len++;lps[i] = len;i++;}else{// (pattern[i] != pattern[len])if (len != 0){len = lps[len - 1];// 不要遗漏这个// 否则,你可能会在以下情况中得到错误的答案// AAACAAAA 和 AAA}else{lps[i] = 0;i++;}}}return lps;}// KMP搜索算法public static int KMPSearch(string pat, string txt){int M = pat.Length;int N = txt.Length;// 创建lps[]数组,大小为M,并初始化为0int[] lps = new int[M];// 预处理填充lps[]ComputeLPSArray(pat, M, lps);int j = 0; // 用于pat[]的索引int i = 0; // 用于txt[]的索引while (i < N){if (pat[j] == txt[i]){j++;i++;}if (j == M){// 找到模式Console.WriteLine("Found pattern at index " + (i - j));return i - j; // 返回第一个匹配的位置// 如果我们想要找到所有匹配,我们可以注释掉这行代码并改为继续搜索}// 不匹配时else if (i < N && pat[j] != txt[i]){// 不要回溯iif (j != 0){j = lps[j - 1];}else{i = i + 1;}}}// 没有找到模式return -1;}// 示例用法public static void Main(){string txt = "ABABDABACDABABCABAB";string pat = "ABABCABAB";int result = KMPSearch(pat, txt);if (result == -1){Console.WriteLine("Pattern not found");}}
}

在这个示例中,ComputeLPSArray 方法计算了词(Pattern)的部分匹配表(LPS数组),而 KMPSearch 方法实现了KMP搜索算法,它使用LPS数组来避免不必要的字符比较。

Main 方法中,我们定义了一个文本字符串 txt 和一个词 pat,然后调用 KMPSearch 方法来查找词在文本中的第一个出现位置。如果找到了,它会打印出该位置;否则,它会打印出“Pattern not found”。

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

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

相关文章

vite前端UI框架使用详解(2024-05-24)

Vite&#xff08;发音同 "veet"&#xff09;是一种新型前端构建工具&#xff0c;能够显著提升前端开发体验。它主要由两部分组成&#xff1a; 一个开发服务器&#xff0c;它基于原生的ES模块提供了丰富的内建功能&#xff0c;如速度快到惊人的 模块热更新&#xff08…

【Linux安全】Firewalld防火墙

目录 一.Firewalld概述 二.Firewalld和iptables的关系 1.firewalld和iptables的联系 2.firewalld和iptables的区别 三.Firewalld区域 1.概念 2.九个区域 3.区域介绍 4.Firewalld数据处理流程 四.Firewalld-cmd命令行操作 1.查看 2.增加 3.删除 4.修改 五.Firewa…

arping 一键检测网络设备连通性(KALI工具系列二)

目录 1、KALI LINUX简介 2、arping工具简介 3、在KALI中使用arping 3.1 目标主机IP&#xff08;win&#xff09; 3.2 KALI的IP 4、操作示例 4.1 IP测试 4.2 ARP测试 4.3 根据存活情况返回 5、总结 1、KALI LINUX简介 Kali Linux 是一个功能强大、多才多艺的 Linux 发…

表现层框架设计之使用XML设计表现层

使用XML设计表现层&#xff0c;统一Web Form与Windows Form的外观。 1.XML&#xff08;可扩展标记语言&#xff09; XML&#xff08;可扩展标记语言&#xff09;与HTML类似&#xff0c;是一种标记语言。与主要用于控制数据的显示和外观的HTML标记不同&#xff0c;XML标记用于定…

PostgreSQL的扩展(extensions)-常用的扩展之pg_rman

PostgreSQL的扩展&#xff08;extensions&#xff09;-常用的扩展之pg_rman pg_rman 是 PostgreSQL 社区提供的一个备份和恢复管理工具。它能够简化和自动化 PostgreSQL 数据库的备份和恢复过程&#xff0c;并支持全量备份、增量备份和差异备份。pg_rman 提供了方便的命令行接…

【机器学习与大模型】驱动下的电子商务应用

摘要&#xff1a; 随着信息技术的飞速发展&#xff0c;电子商务已经成为当今商业领域中最为活跃和重要的部分之一。而机器学习和大模型的出现&#xff0c;为电子商务带来了新的机遇和挑战。本文深入探讨了机器学习与大模型在电子商务中的应用&#xff0c;包括个性化推荐、精准营…

Java 18:开启Java平台的新纪元

Java 18&#xff1a;探索Java平台的最新飞跃 随着Java 18的发布&#xff0c;Java平台再次证明了其不断创新和适应现代软件开发需求的能力。作为长期支持&#xff08;LTS&#xff09;版本&#xff0c;Java 18不仅带来了性能上的提升&#xff0c;还引入了一系列令人兴奋的新特性…

基于双向长短期记忆 Bi-LSTM 对消费者投诉进行多类分类

前言 系列专栏:【深度学习:算法项目实战】✨︎ 涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域,讨论了各种复杂的深度神经网络思想,如卷积神经网络、循环神经网络、生成对抗网络、门控循环单元、长短期记…

CSS transform 三大属性 rotate、scale、translate

transform 浏览器支持定义和用法translate位移函数rotate旋转函数scale缩放函数 浏览器支持 表格中的数字表示支持该属性的第一个浏览器版本号。 紧跟在 -webkit-, -ms- 或 -moz- 前的数字为支持该前缀属性的第一个浏览器版本号。 定义和用法 transform 属性向元素应用 2D…

在chrome中查找和验证xpath

1、快速获取XPath表达式 按F12打开chrome浏览器的开发者模式&#xff0c;点击选择光标&#xff0c;选择页面上的元素位置&#xff0c;在控制台右键选择Copy XPath&#xff0c;表达式就复制到粘贴板中了。 获取到的xpath路径&#xff1a;//*[id"hotsearch-content-wrapper…

iOS App上架全流程及审核避坑指南

App Store作为苹果官方的应用商店&#xff0c;审核严格周期长一直让用户头疼不已&#xff0c;很多app都“死”在了审核这一关&#xff0c;那我们就要放弃iOS用户了吗&#xff1f;当然不是&#xff01;本期我们从iOS app上架流程开始梳理&#xff0c;详细了解下iOS app上架的那些…

6.1 if语句

计算机语言和人类语言类似&#xff0c;人类语言是为了解决人与人之间交流的问题&#xff0c;而计算机语言是为了解决程序员与计算机之间交流的问题。程序员编写的程序就是计算机的控制指令&#xff0c;控制计算机的运行。借助于编译工具&#xff0c;可以将各种不同的编程语言的…

基础入门三大核心之HTML篇:WebP格式图像全面解析 —— 起源、优势、兼容性及在线压缩方法

基础入门三大核心之HTML篇&#xff1a;WebP格式图像全面解析 —— 起源、优势、兼容性及在线压缩方法 欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以…

冯喜运:5.24黄金今日能否回调?日内国际黄金美原油操作策略

【黄金消息面分析】&#xff1a;在过去的半个世纪里&#xff0c;美国国债作为买入持有的投资手段&#xff0c;轻松超越了黄金。然而&#xff0c;如今债券作为终极避险资产的地位正面临着前所未有的挑战。传统上&#xff0c;投资者将美国国债视为一种超安全的投资&#xff0c;因…

Java高级面试精粹:问题与解答集锦(二)

Java面试问题及答案 1. 什么是Java内存模型&#xff08;JMM&#xff09;&#xff1f;它的作用是什么&#xff1f; 答案&#xff1a; Java内存模型&#xff08;JMM&#xff09;定义了Java虚拟机&#xff08;JVM&#xff09;在计算机内存中的工作方式&#xff0c;包括程序计数器…

【源码+文档+讲解】垃圾分类系统SSM

目 录 摘 要 前 言 第1章 概述 1.1 研究背景 1.2 研究目的 1.3 研究内容 4 第二章 开发技术介绍 5 2.1Java技术 6 2.2 Mysql数据库 6 2.3 B/S结构 7 2.4 SSM框架 8 第三章 系统分析 3.1 可行性分析 3.1.1 技术可行性 3.1.2 经济可行性 3.1.3 操作可行性 3.2 系统…

Word让标题3现形

1 2这个玩意儿是管理样式&#xff08;你找得我好惨啊啊啊啊&#xff09; 3点推荐

MINLP(Mixed-Integer Nonlinear Programming,混合整数非线性规划)

MINLP&#xff08;Mixed-Integer Nonlinear Programming&#xff0c;混合整数非线性规划&#xff09;问题是一类包含整数变量和连续变量的非线性优化问题。它结合了整数规划&#xff08;IP&#xff09;和非线性规划&#xff08;NLP&#xff09;的特征&#xff0c;因而比单纯的整…

基于Vue的图片文件上传与压缩组件的设计与实现

摘要 随着前端技术的发展&#xff0c;系统开发的复杂度不断提升&#xff0c;传统开发方式将整个系统做成整块应用&#xff0c;导致修改和维护成本高昂。组件化开发作为一种解决方案&#xff0c;能够实现单独开发、单独维护&#xff0c;并能灵活组合组件&#xff0c;从而提升开…

JS-02对象的基本使用

目录 1 创建一个对象 2 对象属性操作 2.1 获取属性 第一种方式&#xff1a;.语法 第二种方式&#xff1a;[]语法 2种方式的差异 2.2 设置属性 2.3 删除属性 3 案例 1 创建一个对象 创建一个对象&#xff0c;包含了两个属性&#xff0c;两个方法&#xff1a; var studen…