4.2_1樸素模式匹配算法

知識總覽:

什么是字符串的模式匹配:

主串:想從該串獲取結果的串

模式串:想搜索的內容,不一定在主串中能搜到,子串一定能在主串中搜到

字符串模式匹配:在主串找模式串并返回找到的第一個模式串所在位置

?樸素模式匹配算法:

暴力匹配,從主串選取跟模式串長度一樣的子串去跟模式串對比,倆串相等返回首字符下標,倆串不相等繼續找,直到找到為止返回首字符下標或者找完也找不到為止。

實現方法1:Index()函數定位操作

跟上一節找主串的子串函數一樣

注意目前的串都是用的靜態數組且是數組第一個字符位置不適用的形式,即數組存儲字符的下標跟字符位序相同,且找模式串可尋找的次數為n-m+1(n為主串,m為模式串)

實現方法2:不用Index()函數定位,使用指針

?第一輪:

設置2個掃描指針,分別掃描主串和模式串,指針指到哪則2個串的字符比較到哪,開始i和j分別指向主串S和模式串T的下標為1的第一個字符,分別為a和a即相等,則倆指針后移指向下標為2的第2個字符,都為b繼續后移,來指針都指向第3個字符a都相等,繼續后移指向第4個字符a相等,繼續后移指向第5個字符都為b相等,繼續后移此時倆指針都指向第6個字符,i指向主串S的a,j指向模式串的T的c,則倆字符不相等,指向主串的指針i回到指向下一個子串的第一個位置,即主串S的第2個字符位置,指向模式串的指針j回到模式串的第一個位置

i=i-j+2;//即此時i=6,j=6,下一輪i=i-j+2=2

//倆指向字符不相等時,j當前的值表示匹配到了子串的第幾個字符,i-j就可以讓i的值回到目前這個子串的前邊一個位置,i和j都是統一往前移的,因為指針i要指向下一個子串的第一個位置,所以要在此基礎上+2,如下圖現在j指向了當前子串的第6個字符,i=6,j=6,i=i-j=0即i回到了這個子串的前邊一個位置(注意是當前子串的前邊一個位置,不是當前子串的第一個位置,這意味著要指向下一個子串的第一個位置要+2,因為+1就又指向當前子串的第一個位置了),然后還要刨除這個子串的第一個位置指向下一個字串的第一個位置,則要i=i+2=2

j=1;//即此時j=6,下一輪j=1,j指向模式串起始位置

第2輪:?

i的值恢復為2即i==2,j的值恢復為1即j==1,倆指針指向的值為b和a不相等,即i指向的當前子串和模式串不相等,則i=i-j=2-1=1即i回到當前子串b的前一個位置,i=i+2=3為指向下一個子串的第一個位置,指向模式串T的指針j回到模式串第一個位置即j==1

i=i-j+2;//即此時i=2,j=1,下一輪i=i-j+2=2-1+2=3

j=1;//即此時j=6,下一輪j=1,j指向模式串起始位置

?

第3輪:

上同,i從第3個字符開始的子串和j=1開始的模式串比較,每當發現i和j所指的字符相同的時候,讓i和j分別+1,當i==4,j==2時不相等,i回到下一個子串的第一個位置,j回到起始位置

i=i-j+2;//即此時i=4,j=2,下一輪i=i-j+2=4-2+2=4

j=1;//即此時j=2,下一輪j=1,j指向模式串起始位置

?

第4輪:

每當發現i和j所指的字符相同的時候,讓i和j分別+1,當j所指的位置超出了模式串的長度,就說明匹配成功,則返回當前子串的第一個字符位置即讓i-j即可,注意沒有+1,因為在匹配成功的時候i和j都已經往前移動了1個位置,所以當i-j的時候其實指向的位置為當前子串的第一個字符位置

?

代碼版:

2個指針i和j,i指向主串,j指向模式串,初始值都為1即指向主串和模式串的第一個字符,如下while循環

if(S.ch[i]==T.ch[j]); ++i;++j;即當前2個指針指向的字符相等,讓i和j都+1

i=i-j+2;j=1;即當前2個指針指向的字符不相等則讓i回到下一個子串的第一個字符位置,j回到模式串第1個位置

return i-T.length;如果匹配成功,則說明j>T.length,已跳出while循環

return 0;;即匹配失敗,即i已經把整個主串走了一遍,即在走到主串的最后一個字符時,不相等,i的下一輪下標為S.length+1(我怎么感覺S.length要比實際的字符個數多1個,因為S數組中存儲的第一個位置沒有存元素啊,比說最后一個字符index=3,實際S.length=4吧,那下一個位置i不就是4嗎,那這個while循環不是還能走一遍嗎,但是走的話if第一個語句就數組下標越界了吧。。。。。。。。。。。。。。。。)

?

最壞時間復雜度:

假如有如下長度為n的主串,長度為m的模式串,子串和模式串匹配的時候每次只有最后一個字符不相等,且主串n只有在最后一個m長度的子串中才和模式串匹配,即要總共匹配n-m+1次,每次都要匹配m個長度,則時間開銷為(n-m+1)m=nm-m2+m,即時間開銷為O(nm),因為一般n>>m,所以把m2舍去

?

?知識回顧:

。。。。。。。。。。。。。。。?

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

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

相關文章

華為云Flexus+DeepSeek征文|華為云ModelArts搭建Dify-LLM應用開發平臺(AI智能選股大模型)

前言 在當今數字化時代,人工智能(AI)技術在金融領域的應用愈發廣泛,其中 AI 智能選股大模型備受關注。為了構建高效且精準的 AI 智能選股大模型,選擇合適的開發平臺和工具至關重要。華為云 ModelArts 作為一款面向 AI …

C4.5算法深度解析:決策樹進化的里程碑

C4.5是機器學習史上最經典的算法之一,由ID3之父Ross Quinlan在1993年提出。作為ID3的革命性升級,它不僅解決了前代的核心缺陷,更開創了連續特征處理和剪枝技術的先河,成為現代決策樹的奠基之作。 本文由「大千AI助手」原創發布&am…

leetcode 65

#include <string> #include <vector> #include <unordered_map> using namespace std;class Solution { public:bool isNumber(string s) {// 定義狀態轉移表vector<unordered_map<char, int>> states {{{ , 0}, {s, 1}, {d, 2}, {., 4}}, // …

微服務(nacos+myibatis)中如何在一個模塊調用多數據庫源的一種方案

#nacos配置默認數據庫 spring.datasource.typecom.alibaba.druid.pool.DruidDataSource spring.datasource.driverNamecom.mysql.jdbc.Driver #默認數據庫名 master spring.datasource.dynamic.primarymaster spring.datasource.dynamic.strictfalse spring.datasource.d…

高標準通信國際接軌,Ethercat與PROFINET網關實現全自動化生產線

在呼和浩特&#xff0c;集成商以其先進的食品飲料行業解決方案&#xff0c;為乳制品行業打造了一個智能化工廠的典范。這個工廠的核心是PROFINET全集成自動化&#xff08;TIA&#xff09;&#xff0c;它通過SIMATIC S7-1200 PLC和ethercat系統&#xff0c;構建了一個強大的PROF…

Netty 引用計數抽象類 AbstractReferenceCountedByteBuf 詳解

核心類圖 ----------------------------- ---------------------------------- | ReferenceCountUpdater | | AbstractReferenceCountedByteBuf | | <T extends ReferenceCounted>| | (extends AbstractByteBuf) | ----------…

用Python做一個手機鏡頭

文章目錄 設置光學參數添加光學器件 設置光學參數 官方文檔&#xff1a;設計手機鏡頭 rayoptics中提供了OpticalModel類&#xff0c;可用于創建光學模型對象。OpticalModel類中的【optical_spec】成員&#xff0c;是一個OpticalSpecs對象&#xff0c;可用于指定光圈、視野、光…

16.1 Python應用容器化終極指南:Dockerfile多階段構建與安全優化實戰

Python應用容器化終極指南:Dockerfile多階段構建與安全優化實戰 #mermaid-svg-6Yor3ONhmPaQAcY6 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-6Yor3ONhmPaQAcY6 .error-icon{fill:#552222;}#mermaid-svg-6Yor3ON…

基于SpringBoot + Vue打造的畫師約稿平臺實現

概述 基于SpringBoot Vue打造的畫師約稿平臺&#xff0c;該平臺設計精美、功能完善&#xff0c;無論是想要搭建類似平臺的開發者&#xff0c;還是對畫師約稿系統感興趣的人士&#xff0c;都能從中獲取有價值的信息。 主要內容 ??用戶端功能??&#xff1a; 如圖所示&…

杰理-耳機-可視化sdk-最大音量提示音-7016G

杰理-耳機-可視化sdk-最大音量提示音 1.音量最大的時候發出消息 2.通過 MSG_FROM_AUDIO 進行發送 3.創建地方接收&#xff0c;并且播放提示音 學習q群:187115320

抖音圖文帶貨權限怎么開通

在這個數字化營銷蓬勃發展的時代&#xff0c;抖音作為一個流量巨大的平臺&#xff0c;為廣大創作者和商家提供了豐富的變現途徑。其中&#xff0c;圖文帶貨權限就是一個有效的拓寬變現能力的一個渠道。 那么&#xff0c;如何才能開通抖音的圖文帶貨功能呢&#xff1f; 開通抖…

80、指標監控-Boot Admin Server

80、指標監控-Boot Admin Server Boot Admin Server是一個用于監控和管理Spring Boot應用程序的開源工具&#xff0c;以下是其相關介紹&#xff1a; #### 主要功能 - **應用狀態監控** - 顯示應用的在線狀態、啟動時間、運行時長等基本信息。 - 監控JVM指標&#xff0c;如內存…

Linux系統之Nginx反向代理與緩存

目錄 一、正向代理和反向代理 1.1 正向代理概述 1.1.1 什么是正向代理 1.1.2 正向代理的作用 1.1.3 正向代理的基本格式 1.2 反向代理概述 1.2.1 什么是反向代理 1.2.2 反向代理可實現的功能 1.2.3 反向代理的可用模塊 二、配置反向代理 2.1 反向代理配置參數 2.1.…

SpringBoot定時任務 - Timer實現方式

定時任務在實際開發中有著廣泛的用途&#xff0c;本文主要幫助你構建定時任務的知識體系&#xff0c;同時展示Timer 的schedule和scheduleAtFixedRate例子&#xff1b;后續的文章中我們將逐一介紹其它常見的與SpringBoot的集成。 知識準備 需要對定時任務的使用場景和常見的實…

系統分析師學習筆記

系統分析師學習筆記 目錄 系統分析師學習筆記前言1 數學與工程基礎&#xff08;選擇題2-4分&#xff09;1.1 圖論與應用&#xff08;考選擇題&#xff09;1.1.1 最小生成樹1.1.2 最短路徑1.1.3 網絡與最大流量&#xff08;常考&#xff09; 1.2 預測與決策&#xff08;在原有基…

《仿盒馬》app開發技術分享-- 邏輯優化第三彈(83)

技術棧 Appgallery connect 開發準備 現在我們的app功能已經趨近完善&#xff0c;bug和缺失的細節也越來越少了&#xff0c;我們繼續對app進行優化&#xff0c;首先是我們的積分頁面&#xff0c;我們只實現了全部的積分展示內容&#xff0c;對收入和支出的積分明細并沒有進行…

(七)Dockerfile文件20個命令大全詳解

目錄 1. FROM 基于基礎鏡像構建 1.1 FROM 指令開頭 1.2 ARG和FROM使用 1.3 FROM可以多個 1.4 AS name 1.5 tag和digest 2. RUN 執行任何命令 2.1 shell和exec兩種使用方式 2.2 [OPTIONS]參數 3. CMD 指定默認執行命令 3.1 使用格式shell和exec兩種使用方式 3.2 只…

攻防世界-MISC-4-2

知識點 1.字頻分析 步驟 下載附件是一段文本&#xff0c; 在線網站處理&#xff1a;quipqiup - cryptoquip and cryptogram solver flag{classical-cipher_is_not_security_hs}

Nordic nRF54L15 SoC對包含電池監測、中斷處理和電源軌控制的定制 nPM1300 示例

1&#xff1a;以下是適用于 nRF Connect SDK (NCS) 的基于 Zephyr 的示例應用程序&#xff0c;展示了&#xff1a; 讀取電池電壓和狀態處理來自 nPM1300 的中斷&#xff08;例如&#xff0c;電池或電源軌事件&#xff09;控制電源軌&#xff08;通過 GPIO 啟用/禁用&#xff0…

MySQL 單機部署

文章目錄 1、準備階段1.1、部署規劃1.2、硬件準備1.3、軟件準備1.4、環境清理 2、實施階段2.1、操作系統實施2.2、數據庫部署實施 3、完成 1、準備階段 1.1、部署規劃 本次部署用于測試環境&#xff0c;單機模式&#xff0c;不需要主備&#xff1b;MySQL數據庫版本要MySQL5.7…