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.pswp.cn/diannao/14015.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/14015.shtml
英文地址,請注明出處:http://en.pswp.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…