數據結構學習——KMP算法

//KMP算法
#include <iostream>
#include <string>
#include <vector>
#include <cstdlib>using namespace std;//next數組值的推導void getNext(string &str, vector<int>& next){int strlong = str.size();//next數組的0位為0next[0]=0;//i為當前字符的位置,從1位(第2個開始)int i=1;//length為當前字符之前的最長匹配子串的長度int length=0;while(i<strlong){if(str[i]==str[length]){//cout<<"當前字符匹配"<<str[i]<<"和"<<str[length]<<endl;length++;next[i]=length;i++;}else{/*如果length為0,說明當前字符之前沒有匹配的子串,next數組值為0,i進一位*/if(length==0){//cout<<"當前字符之前沒有匹配的子串"<<endl;next[i]=0;i++;}/*如果length不為0,說明當前字符之前有匹配的子串,通過即查看上一個位置的最長匹配長度,繼續嘗試匹配*/else{//cout<<"當前字符之前有匹配的子串"<<endl;//查找這個字串之前得最長公共前后綴length=next[length-1];}}}
}//匹配
void insert(string &str, string &insert_str, vector<int>& next){cout<<"next數組為:"<<endl;for(int a=0;a<next.size();a++){cout<<next[a]<<" ";}int i=0;int j=0;int num=0;while(i<str.size()){num++;cout<<"第"<<num<<"次匹配,匹配到原字符串的第"<<i<<"位"<<str[i] <<endl;if(str[i]==insert_str[j]){cout<<"第一項匹配成功"<<endl;i++;j++;if(j==insert_str.size()){cout<<"原字符串為:"<<str<<endl;cout<<"匹配成功,從第"<<i-j+1<<"個字母開始"<<endl;cout<<"匹配內容為:";for(int k=i-j;k<i-j+insert_str.size();k++){cout<<str[k];}cout<<endl;cout<<"匹配次數為:"<<num<<endl;return;}}else{if(j!=0){cout<<"匹配失敗,回溯至";j=next[j-1];cout<<"位置"<<j<<endl;cout<<str[i-j]<<"處"<<endl;}else{i++;}}}cout<<"匹配次數為:"<<num<<endl;cout<<"匹配失敗"<<endl;}void violent(string str, string insert_str) {int i = 0; // 主串指針int j = 0; // 模式串指針int num = 0; // 匹配嘗試次數計數器while (i < str.size()) {num++;if (str[i] == insert_str[j]) {i++;j++;if (j == insert_str.size()) {// 成功匹配cout << "匹配成功" << endl;cout << "匹配子串為:";for (int k = i - j; k < i; k++) {cout << str[k];}cout << endl;cout << "匹配次數為:" << num << endl;return;}} else {i = i - j + 1; // 回退到本次匹配起始位置的下一個字符j = 0;         // 重置模式串指針}}// 匹配失敗cout << "匹配失敗" << endl;cout << "總共嘗試匹配次數為:" << num << endl;
}
int main(){string insert_str="aaad";vector<int> next(insert_str.size());getNext(insert_str,next);string str="daaaaaad";insert(str,insert_str,next);violent(str,insert_str);return 0;}

next即為需找位置得str的next

這里我還寫了一個暴力破解的

我們來分析一下次數是怎么來的

aaad的next為0120

如果是暴力算法,次數為1+4+4+4+4=17

1是因為第一項不符合直接過,4是因為我構造的是aaad,所以他每次都要判斷4次才能確定

如果是kmp,次數為1+4+2+2+2=11

在我們4比完后,j=2對應next數組為2,我們直接用2號位[第三個字母]去和之前p對應去比,

發現可以,那么值需要接著我往下比就好了,str的1,2字母無須比較,故為2,少比兩個

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/84460.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/84460.shtml
英文地址,請注明出處:http://en.pswp.cn/web/84460.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

博士,超28歲,出局!

近日&#xff0c;長沙市望城區《2025年事業引才博士公開引進公告》引發軒然大波——博士崗位年齡要求28周歲及以下&#xff0c;特別優秀者也僅放寬至30周歲。 圖源&#xff1a;網絡 這份規定讓眾多"高齡"博士生直呼不合理&#xff0c;并在社交平臺掀起激烈討論。 圖源…

使用Nuitka打包Python程序,編譯為C提高執行效率

在 Python 的世界里&#xff0c;代碼打包與發布一直是開發者關注的重要話題。前面我們介紹了Pyinstaller的使用&#xff0c;盡管 PyInstaller 是最常用的工具之一&#xff0c;但對于性能、安全性、兼容性有更高要求的項目&#xff0c;Nuitka 正迅速成為更優的選擇。本文將全面介…

基于機器學習的惡意請求檢測

好久沒寫文章了&#xff0c;忙畢業設計ING&#xff0c;終于做好了發出來。 做了針對惡意URL的檢測&#xff0c;改進了楊老師這篇參考文獻的惡意請求檢測的方法 [網絡安全自學篇] 二十三.基于機器學習的惡意請求識別及安全領域中的機器學習-CSDN博客 選擇使用了XGBoost算法進…

深入理解XGBoost(何龍 著)學習筆記(五)

深入理解XGBoost&#xff08;何龍 著&#xff09;學習筆記&#xff08;五&#xff09; 本文接上一篇&#xff0c;內容為線性回歸&#xff0c;介紹三部分&#xff0c;首先介紹了"模型評估”&#xff0c;然后分別提供了線性回歸的模型代碼&#xff1a;scikit-learn的Linear…

工業級MySQL基準測試專家指南

工業級MySQL基準測試專家指南 一、深度風險識別增強版 風險類型典型表現進階檢測方案K8s存儲性能抖動PVC卷IOPS驟降50%使用kubestone進行CSI驅動壓力測試HTAP讀寫沖突OLAP查詢導致OLTP事務超時用TPCH+Sysbench混合負載測試冷熱數據分層失效壓縮表查詢耗時激增10倍監控INNODB_C…

Spring WebFlux和Spring MVC的對比

原文網址&#xff1a;Spring WebFlux和Spring MVC的對比-CSDN博客 簡介 本文介紹Spring WebFlux和Spring MVC的區別。 Webflux&#xff1a;是異步非阻塞的&#xff08;IO多路復用&#xff09;&#xff0c;基于Netty。適合網絡轉發類的應用&#xff0c;比如&#xff1a;網關。…

解析401 Token過期自動刷新機制:Kotlin全棧實現指南

在現代Web應用中&#xff0c;Token過期導致的401錯誤是影響用戶體驗的關鍵問題。本文將手把手實現一套完整的Token自動刷新機制&#xff0c;覆蓋從原理到實戰的全過程。 一、為什么需要Token自動刷新&#xff1f; 當用戶使用應用時&#xff0c;會遇到兩種典型場景&#xff1a;…

《解構線性數據結構的核心骨架:從存儲模型到操作范式的深度解析》

線性數據結構概述 線性數據結構是數據元素按線性順序排列的集合,每個元素有唯一的前驅和后繼(除首尾元素)。常見類型包括數組、隊列、鏈表和棧,每種結構在存儲和操作上具有獨特特性。 線性表:顧名思義,線性表就是數據排成像一條線的結構。每個線性表上的數據最多只有前和后…

HW藍隊工作流程

HW藍隊工作流程 由多領域安全專家組成攻擊隊&#xff0c;在保障業務系統安全的前提下&#xff0c;直接在真實網絡環境開展對抗&#xff0c;對參演單位目標系進行可控、可審計的網絡安全實戰攻擊&#xff0c;通過攻防演習檢驗參演單位的安全防護和應急處置能力&#xff0c;提高…

語音相關-瀏覽器的自動播放策略研究和websocket研究

策略詳情 媒體參與度 AudioContext音頻API的實現 new Audio音頻API的實現 相關實踐 網頁端 使用new Audio創建的音頻對象進行音頻播放的時候&#xff0c;如果用戶沒有與頁面進行交互&#xff0c;那么會報錯如下&#xff1a; 使用AudioContext創建的對象播放音頻&#xff0c;…

Linux操作系統網絡服務模塊一DHCP服務概述

前言&#xff1a; 在Linux網絡服務體系架構中&#xff0c;?DHCP&#xff08;Dynamic Host Configuration Protocol&#xff09;?? 作為核心服務之一&#xff0c;承擔著局域網內主機網絡參數動態分配的關鍵任務。其設計初衷是解決傳統手動配置IP地址的效率瓶頸與錯誤風…

FPGA基礎 -- Verilog語言要素之變量類型

Verilog 變量類型&#xff08;Variable Types&#xff09; 一、什么是變量類型&#xff1f; 在 Verilog 中&#xff0c;變量類型用于保存過程賦值結果&#xff08;由 always 或 initial 塊賦值&#xff09;&#xff0c;通常用于建模寄存器、狀態、計數器等“帶記憶”的硬件行為…

使用Haporxy搭建Web群集

目錄 一、案例分析 1.案例概述 2.案例前置知識點 2.1 HTTP請求 2.2 負載均衡常用調度算法 2.3常見的Web群集調度器 3.案例環境 3.1本案例環境 二、案例實施 1.搭建兩臺web服務器 2.安裝Haproxy 3.haproxy服務器配置 修改haproxy的配置文件 4.測試web群集 5.haproxy的日…

pikachu靶場通關筆記38 目錄遍歷(路徑遍歷)

目錄 一、目錄遍歷 二、源碼分析 三、目錄遍歷與文件包含 四、實戰滲透 1、進入靶場 2、目錄遍歷 &#xff08;1&#xff09;訪問ace.min.css &#xff08;2&#xff09;訪問fileinclude.php 本系列為《pikachu靶場通關筆記》滲透實戰&#xff0c;本文通過對目錄遍歷源…

現代C++:std::string全方位碾壓C字符串

在 C 中引入的 std::string 是對 C 語言中 char* 和 const char* 的一種現代化封裝和增強。它不僅解決了 C 字符串的許多缺陷&#xff08;如安全性、內存管理、易用性等&#xff09;&#xff0c;還提供了豐富的 API 來簡化字符串操作。本文將從多個維度詳細對比 std::string 與…

20250619周四:Atlassian

今天主要把conference上的A xxx的所有資料大體看了一遍&#xff0c;花了兩個多小時。 公司的這個conference系統&#xff0c;共實就是一個大型的可多人在線編輯的文件系統。差不多所有的資料都共享在上面。這對于多人參與的項目管理&#xff0c;還是相當方便的。 Atlassian最特…

通過CDH安裝Spark的詳細指南

通過CDH安裝Spark的詳細指南 簡介 Cloudera Distribution of Hadoop (CDH) 是一個企業級的大數據平臺,它集成了多個開源組件,包括Hadoop、Spark、Hive等。本文將詳細介紹如何通過CDH安裝和配置Spark。 前提條件 在開始安裝之前,請確保滿足以下條件: 已安裝CDH集群具有管…

GitLab CVE-2025-5121 安全漏洞解決方案

本分分享極狐GitLab 補丁版本 18.0.2, 17.11.4, 17.10.8 的詳細內容。這幾個版本包含重要的缺陷和安全修復代碼&#xff0c;我們強烈建議所有私有化部署用戶應該立即升級到上述的某一個版本。對于極狐GitLab SaaS&#xff0c;技術團隊已經進行了升級&#xff0c;無需用戶采取任…

【八股消消樂】Elasticsearch優化—檢索Labubu

&#x1f60a;你好&#xff0c;我是小航&#xff0c;一個正在變禿、變強的文藝傾年。 &#x1f514;本專欄《八股消消樂》旨在記錄個人所背的八股文&#xff0c;包括Java/Go開發、Vue開發、系統架構、大模型開發、具身智能、機器學習、深度學習、力扣算法等相關知識點&#xff…

如何實現基于場景的接口自動化測試用例?

&#x1f345; 點擊文末小卡片&#xff0c;免費獲取軟件測試全套資料&#xff0c;資料在手&#xff0c;漲薪更快 自動化本身是為了提高工作效率&#xff0c;不論選擇何種框架&#xff0c;何種開發語言&#xff0c;我們最終想實現的效果&#xff0c;就是讓大家用最少的代碼&…