【KMP算法】學習總結

說明

  1. 文章內容為對KMP算法的總結,以及力扣例題;
  2. 文章內容為個人的學習總結,如有錯誤,歡迎指正。

文章目錄

  • 1. KMP算法
    • 1.1 算法步驟
    • 1.2 關于指針回退問題
  • 2 . LeetCode例題

1. KMP算法

1.1 算法步驟

KMP算法通常用于字符串的匹配,解題分兩步:

  1. 構建模式串的next數組。
    一般來說next數組就是前綴表(不太準確,但差不多是那個意思)。next[i]表明當第i個元素不匹配時應該回退到哪個位置:
    比如第i個元素不匹配,此時應尋找i之前的子串的最長相同前后綴的長度,這個長度的值就是next[i-1]的值。
    例:aab當i指向‘b’是發生了失配,此時應尋找b之前的子串,即‘aa’的最長相同前后綴的長度(=1),也就是說此時i指針應回退到下標為1的位置繼續比較
  2. 匹配
    即模式串與主串的匹配。兩個指針i,j分別指向主串和模式串,若二者匹配則兩個指針后移;若發生失配,則指向模式串的指針j進行回退,重新匹配。

1.2 關于指針回退問題

關于指針回退的問題,我梳理一下:
例如:

主串='aabaabaaf'
模式串='aabaaf'

在這里插入圖片描述

  1. 匹配時,模式串的‘f’與主串的‘b’不匹配,此時模式串的指針應該回退,但是回退到哪個位置呢?KMP算法告訴我們應該回退到模式串‘b’的位置,為什么呢?

  2. 因為不匹配的‘f’之前的子串——‘aabaa’的最長相同前后綴長度為2,即‘b’的下標。‘f’失配,但是‘aabaa’是和主串相匹配的,也就是說模式串中的“aa”(下標為3,4)與主串中的“aa”(下標為3,4)是相匹配的,而且子串“aabaa”中,后綴“aa”有最長相同的前綴“aa”(下標為0,1),也就是說這個前綴“aa”(下標0,1)和主串中的“aa”(下標為3,4)也是相匹配的,所以無需重復比較,直接將指針回退到模式串的‘b’位置繼續比較即可。
    在這里插入圖片描述

  3. 所以next[i]中存儲的是i以及i以前的子串的最長相同前后綴長度。那么當i發生失配時,就要找i以前(0~i-1)的子串的最長相同前后綴長度是多少,然后回退到這個位置。
    比如‘f’失配時,要找‘f’之前的子串的最長相同前后綴長度(aabaa的最長相同前后綴長度)

2 . LeetCode例題

28. 找出字符串中第一個匹配項的下標

class Solution {
public:int strStr(string haystack, string needle) {vector<int> next(needle.size(),0);getNext(next, needle); //創建needle的next數組int j=0;for(int i=0; i<haystack.size(); i++){while(j>0 && haystack[i]!=needle[j])j = next[j-1];//發生失配,j進行回退if(haystack[i] == needle[j])j++;if(j == needle.size())return (i - needle.size() +1);//主串中出現了模式串,返回第一次出現模式串的下標}return -1; //主串中沒有出現模式串,返回-1}void getNext(vector<int>& next, string needle){int n = needle.size();int j = 0; //j指向前綴的末尾next[0] = 0;//初始化nums[0]for(int i=1; i<n; i++){//j從0開始,則i從1開始,i指向后綴的末尾,初始前后綴的長度都是1while(j>0 && needle[i]!=needle[j])j = next[j-1];//前后綴的末尾不匹配,j指針進行回退//j指針的回退相當于減小前綴的長度,當前綴末尾和后綴末尾相同時,此時就找到了needle[i](包括needle[i])之前的最長相同前后綴的長度;否則最長相同前后綴長度為0if(needle[i] == needle[j]){j++; //前后綴末尾相同時,同時后移i,j指針}next[i] = j;//將j的位置賦值給next[i],表明第i個元素發生失配時應該回退到哪個位置}}
};

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

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

相關文章

springboot_vue知識點

代碼放到了倉庫。 springboot_vue知識點 1.搭建1.vue2.springboot 2.前后端請求和響應的封裝1.請求封裝2.響應封裝 3.增刪改查1.查詢2.分頁3.新增和編輯4.刪除 4.跨域和自定義異常5.JWT鑒權1.配置pom2.攔截前端請求的攔截器3.生成token并驗證token4.登錄后生成token5.前端獲取…

git如何查看配置,修改配置,設置配置

# 顯示當前的Git配置 $ git config --list# 編輯Git配置文件 $ git config -e [--global]# 設置提交代碼時的用戶信息 $ git config [--global] user.name "[name]" $ git config [--global] user.email "[email address]"

Grafana如何實現折線柱狀圖

程序員的公眾號&#xff1a;源1024&#xff0c;獲取更多資料&#xff0c;無加密無套路&#xff01; 最近整理了一份大廠面試資料《史上最全大廠面試題》&#xff0c;Springboot、微服務、算法、數據結構、Zookeeper、Mybatis、Dubbo、linux、Kafka、Elasticsearch、數據庫等等 …

競賽選題 車位識別車道線檢測 - python opencv

0 前言 &#x1f525; 優質競賽項目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度學習 機器視覺 車位識別車道線檢測 該項目較為新穎&#xff0c;適合作為競賽課題方向&#xff0c;學長非常推薦&#xff01; &#x1f947;學長這里給一個題目綜合評分(每項滿分5分) …

從六個方面對比Go和Python的差異

您是否想過 Go 與 Python 之間的主要區別是什么&#xff1f;隨著對軟件開發人員的需求不斷增加&#xff0c;選擇哪種編碼語言可能會很困難。 ? 在此&#xff0c;我們將從六個方面對比Go和Python,探討 Go 和 Python之間的差異。我們將討論它們的特點、優缺點&#xff0c;以便…

GPT、GPT-2、GPT-3論文精讀筆記

視頻&#xff1a;GPT&#xff0c;GPT-2&#xff0c;GPT-3 論文精讀【論文精讀】_嗶哩嗶哩_bilibili MAE論文&#xff1a;把bert用回計算機視覺領域 CLIP論文&#xff1a;打通文本和圖像 GPT 論文&#xff1a;Improving Language Understanding by Generative Pre-Training …

史詩級云故障敲響警鐘,應用保障不能沒有“連續鍵”!

近日&#xff0c;知名云服務商出現一次史詩級的云故障&#xff1a;全球所有區域/所有服務同時異常&#xff0c;故障持續長達3小時之多&#xff0c;云上眾多應用受到極大影響。 如今&#xff0c;在一個充滿不確定性和復雜性的數字化時代&#xff0c;哪怕是頂級云服務商亦不能避…

python-append與extend的區別

append 和 extend 是用于向列表&#xff08;List&#xff09;添加元素的兩種不同的方法&#xff0c;它們在功能上有一些重要的區別。 append 方法&#xff1a; append 方法用于在列表的末尾添加單個元素。語法&#xff1a;list.append(element)示例&#xff1a;my_list [1, 2,…

并行與分布式計算 第9章 算法設計

文章目錄 并行與分布式計算 第9章 算法設計9.1 設計過程9.1.1 PCAM設計過程9.1.2 劃分9.1.3 通信9.1.4 組合9.1.5 映射 8.2 設計方法8.2.1 劃分技術9.2.2 分治9.2.3 平衡樹技術9.2.4倍增技術9.2.5 流水線技術9.2.6 破對稱技術 并行與分布式計算 第9章 算法設計 9.1 設計過程 …

一張圖,了解美格智能高算力AI模組

美格智能高算力A模組&#xff0c;澎湃算力讓AI觸手可及&#xff01;

數字化背景下,集流體行業的智能制造方法論

行業背景 隨著全球對清潔能源需求的不斷增加&#xff0c;新能源領域正在迅速崛起&#xff0c;在新能源技術中&#xff0c;鋰電池作為一種高效、輕便的能量儲存解決方案&#xff0c;正成為主流。而鋰電集流體作為鋰電池的核心部件&#xff0c;承擔著電池內部電流分布的關鍵角色…

掌握Java關鍵字與面試技巧的完美結合!

問題&#xff1a;請說明什么是策略模式&#xff0c;并使用Java代碼舉例說明其使用場景和實現方式。 答案&#xff1a; 策略模式是一種行為型設計模式&#xff0c;它允許在運行時根據不同的情況選擇不同的算法或策略。它將每個可選的算法封裝成一個獨立的類&#xff0c;從而使得…

服務號可以遷移到訂閱號嗎

服務號和訂閱號有什么區別&#xff1f;服務號轉為訂閱號有哪些作用&#xff1f;首先我們要看一下服務號和訂閱號的主要區別。1、服務號推送的消息沒有折疊&#xff0c;消息出現在聊天列表中&#xff0c;會像收到消息一樣有提醒。而訂閱號推送的消息是折疊的&#xff0c;“訂閱號…

RHEL 8.6 Kubespray 1.23.1 install kubernetes v1.27.7

文章目錄 1. 預備條件配置網卡download01 節點安裝 nerdctl3. download01 節點 介質下載4. bastion01節點配置 yum 源5. bastion01 離線安裝 nerdctl安裝l insecure registry配置鏡像入庫執行 set-all.sh7. bastion01 配置互信8. 啟動容器部署環境9. 部署前準備9.1 配置 extrac…

分布式篇---第二篇

系列文章目錄 文章目錄 系列文章目錄前言一、你知道哪些分布式事務解決方案?二、什么是二階段提交?三、什么是三階段提交?前言 前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到網站,這篇文章男女通用,看懂了就去分享給你…

基于Pytorch框架多人多攝像頭摔倒跌倒墜落檢測系統

歡迎大家點贊、收藏、關注、評論啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代碼。 文章目錄 一項目簡介 二、功能三、系統四. 總結 一項目簡介 深度學習在計算機視覺領域的應用已經取得了顯著的進展&#xff0c;特別是在多人多攝像頭場景下的摔倒跌倒檢測。通過…

java異常 try/catch/throw/throws

try-catch一般用在最上層的程序里&#xff0c;可以配合throws和throw再將異常拋給用戶&#xff0c;這種情況會使上層代碼中斷。也可以不選擇拋出&#xff0c;這種上層代碼會繼續運行。 被調用的方法如果有異常的可能可以通過throws拋給上層處理&#xff0c;不加try catch的情況…

Vue環境的搭建

1.Vue開發的兩種方式 &#xff08;1&#xff09;核心包傳統開發模式 基于html/css/js文件&#xff0c;直接引入和辛堡&#xff0c;開發Vue。 &#xff08;2&#xff09;工程化開發模式&#xff1a; 主要是基于構建工具&#xff08;例如,webpack&#xff09;的環境中開發Vue…

【ARM 嵌入式 編譯系列 2.2 -- 如何在Makefile 中添加編譯時間 | 編譯作者| 編譯 git id】

請閱讀【ARM GCC 編譯專欄導讀】 上篇文章&#xff1a;【ARM 嵌入式 編譯系列 2.1 – GCC 編譯參數學習】 下篇文章&#xff1a;【ARM 嵌入式 編譯系列 2.3 – GCC 中指定 ARMv8-M 的 Thumb 指令集參數詳細介紹】 文章目錄 編譯參數介紹 編譯參數介紹 通常我們在 OS 啟動的時…

福州大學《嵌入式系統綜合設計》實驗五:圖像裁剪及尺寸變換

一、實驗目的 在深度學習中&#xff0c;往往需要從一張大圖中裁剪出一張張小圖&#xff0c;以便適應網絡輸入圖像的尺寸&#xff0c;這可以通過bmcv_image_crop函數實現。 實踐中&#xff0c;經常需要對輸入圖像的尺寸進行調整&#xff0c;以適用于網絡輸入圖片尺寸&#xff0…