字符串匹配 之 KMP算法

文章目錄

  • 習題
    • 28.找出字符串中第一個匹配項的下標
    • 1392.最長快樂前綴

本博客充分參考靈神和知乎的另一位博主

靈神KMP算法模版
知乎博主通俗易懂講解

  • 對于給定一個主串S和一個模式串P,如果讓你求解出模式串P在主串S中匹配的情況下的所有的開始下標
  • 簡單的做法又稱為Brute-Force算法,其實總的來說就是,外層循環遍歷主串S,內存循環遍歷模式串P,逐個匹配,當出現匹配不成功的情況,外層循環回到開始匹配位置+1,內層循環直接返回位置0,可想而知,這個算法的時間復雜度是o(n*m)
  • KMP算法的改進思路,就是比較的時候,肯定是一個個比較的,這個是不能改進的,主要是可以降低比較趟數
    • 外層循環主串S不會退,只回退模式串P,并且模式串P回退的時候充分利用真前綴和真后綴的最大匹配的長度!

話不多說,大家可以看上面知乎的講解就可以啦!

KMP算法python 模版

模版解決的問題:在主串s中查找模式串p,返回所有成功匹配的位置

def kmp(s: str, p: str) -> List[int]:m = len(p)# next[i] 表示p[0] 到 p[i] 的真前綴和真后綴的最大匹配長度next = [0] * m# cnt 用于記錄當前模式串p的真前綴和真后綴的最大匹配長度cnt = 0for i in range(1, m):b = p[i]while cnt and p[cnt] != b:cnt = pi[cnt - 1]if p[cnt] == b:cnt += 1next[i] = cnt# 記錄答案pos = []# cnt 用于存儲主串s和模式串p的匹配長度cnt = 0for i, b in enumerate(text):# 不相等就讓模式串p回退while cnt and p[cnt] != b:cnt = next[cnt - 1]if p[cnt] == b:cnt += 1if cnt == len(p):pos.append(i - m + 1)# 注意這個cnt = next[cnt - 1]return pos

習題

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

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

在這里插入圖片描述

  • 典型的KMP算法的模版題目
class Solution:def strStr(self, haystack: str, needle: str) -> int:# KMP算法m = len(needle)next = [0]*m cnt = 0# 預處理next數組for i in range(1,m):b = needle[i]while cnt and needle[cnt] != b :cnt = next[cnt-1]if needle[cnt] == b:cnt += 1next[i] = cnt # 開始匹配cnt = 0 for i,b in enumerate(haystack):while cnt and needle[cnt] != b:cnt = next[cnt-1]if needle[cnt] == b:cnt += 1if cnt == m:return i - m + 1return -1

1392.最長快樂前綴

1392.最長快樂前綴

在這里插入圖片描述

  • 算法思路:直接使用KMP算法進行求解,最終的next[m-1]就是最大的長度
class Solution:def longestPrefix(self, s: str) -> str:# 這個就是knp算法的max(next)m = len(s)next = [0]*(m)cnt = 0 ans = 0for i in range(1,m):b = s[i]while cnt and s[cnt] != b:cnt = next[cnt-1]if s[cnt] == b:cnt += 1next[i] = cntreturn s[:next[m-1]] if next[m-1] > 0 else ""

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

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

相關文章

Nginx相關知識

目錄 一.HTTP請求數據在服務器中的傳輸與處理詳解 1.2 套字節 1.3 零拷貝技術 二.I/O模型 2.1 I/O模型簡介 2.2 常見的I/O模型及其特點 1.同步/異步 2.阻塞vs 非阻塞 3. 同步/異步與阻塞/非阻塞的關系 4.多路復用I/O模型 5.異步I/O模型 三.Nginx模塊 3.1 概述ng…

分布式數字身份:邁向Web3.0世界的通行證 | 北京行活動預告

數字經濟浪潮奔涌向前,Web3.0發展方興未艾,分布式數字身份(Decentralized Identity,簡稱DID)通過將分布式賬本技術與身份治理相融合,在Web3.0時代多方協作的分布式應用場景中發揮核心作用,是構建…

ES6入門---第三單元 模塊四:Set和WeakSet

set數據結構: 類似數組,但是里面不能有重復值,如果有,只顯示一個 set用法: let setArr new Set([a,b]); setArr.add(a); 往setArr里面添加一項 let setArr new Set().add(a).add(b).add(c); setArr.delete(b); 刪除一項 setArr.ha…

Cognito

首先Cognito沒有提供登錄至AWS控制臺的功能,然而您可以通過Cognito Identity Pool獲取到IAM role的credentials [1],再另外通過代碼自行將IAM role credentials拼湊成AWS控制臺登錄的URL [2]。 最后,由于Cognito的使用除了User Pool以及Iden…

EfficientNet 改進:與Transformer結合的圖像分類模型

1.介紹 在計算機視覺領域,EfficientNet因其高效的網絡架構設計而廣受歡迎。 本文將深入分析一個結合EfficientNet主干和Transformer分類頭的創新模型實現。 模型概述 這個實現將EfficientNet的高效特征提取能力與Transformer的強大序列建模能力相結合,主要包含以下幾個核心…

復雜網絡系列:第 5 部分 — 社區檢測和子圖

關鍵詞:Community Detection Algorithms 一、說明 在本教程中,我們將探討網絡分析的兩個基本方面:社區檢測和使用子圖。了解這些概念將使您能夠發現復雜網絡中隱藏的結構和關系。 二、何為社區,何為社區檢測? 2.1 …

【辦公類-99-04】20250504閔豆統計表excle轉PDF,合并PDF、添加中文字體頁眉+邊框下劃線

需求說明 督導檢查,各條線都要收集資料。 今天去加班,遇到家教主任,她讓我用保教主任的彩色打印機打印這套活躍度表格。(2023學年上學期下學期-2024學年上學期,就是202309-202504) 每個excle都是內容在A4一…

升級 CUDA Toolkit 12.9 與 cuDNN 9.9.0 后驗證指南:功能與虛擬環境檢測

#工作記錄 在 NVIDIA 發布 CUDA Toolkit 12.9 與 cuDNN 9.9.0 后,開發者紛紛選擇升級以獲取新特性和性能提升。 CUDA Toolkit 12.9 與 cuDNN 9.9.0 發布,帶來全新特性與優化-CSDN博客 然而,升級完成并不意味著大功告成,確認升級后…

LLM論文筆記 28: Universal length generalization with Turing Programs

Arxiv日期:2024.10.4機構:Harvard University 關鍵詞 圖靈機 CoT 長度泛化 核心結論 Turing Programs 的提出 提出 Turing Programs,一種基于圖靈機計算步驟的通用 CoT 策略。通過將算法任務分解為逐步的“磁帶更新”(類似圖靈…

【全隊項目】智能學術海報生成系統PosterGenius--圖片布局生成模型LayoutPrompt(1)

🌈 個人主頁:十二月的貓-CSDN博客 🔥 系列專欄: 🏀大模型實戰訓練營_十二月的貓的博客-CSDN博客 💪🏻 十二月的寒冬阻擋不了春天的腳步,十二點的黑夜遮蔽不住黎明的曙光 目錄 1. 前…

位圖的實現和拓展

一:位圖的介紹 ①:需要位圖的場景 給40億個不重復的無符號整數,沒排過序。給一個無符號整數,如何快速判斷一個數是否在這40億個數中? 要判斷一個數是否在某一堆數中,我們可能會想到如下方法: A…

排序功法入門指南【江湖算法筆記】

話說江湖風云變幻,各路英雄好漢行走江湖,總得有個名號排行。若問“東邪西毒南帝北丐”誰強誰弱,總得排個座次不是?這排序之道,恰似武功秘籍,練好了能號令群雄,練岔了怕是要被笑掉大牙&#xff0…

【中間件】brpc_基礎_用戶態線程中斷

bthread之用戶態線程中斷 源碼 1 簡介 interrupt_pthread 核心功能是 通過信號機制中斷阻塞的 pthread 線程,以實現線程的協作式中斷。 2 核心功能與設計 2.1 信號選擇與注冊 信號選擇:使用 SIGURG 作為中斷信號。 原因:SIGURG 通常用于…

Linux 的網絡卡

#本機操作系統CentOS 10 #核心版本 rootbogon:/etc# uname -r 6.12.0-65.el10.x86_64 網卡能不能被捉到可以使用【dmesg|grep xx】來判斷,有沒有驅動則可以使用lsmod看看模塊有沒有加載核心!最后,以ifconfig xxx測試看看 觀察核心所捉到的網卡…

前端雙工通信的幾種方案詳細描述

前端實現雙工通信(全雙工或半雙工)的常見方案及詳細實現如下: 一、WebSocket(全雙工) 原理:基于 TCP 的持久化協議,客戶端與服務端建立雙向通信通道,支持實時雙向數據傳輸。 // 客…

KUKA機器人快速啟動設置

KUKA機器人在首次開機啟動時,有時在示教器上需要進行投入運行等相關的設置。如以下相關的信息需要處理: 1、機器人系統開機后,選擇T1運行模式;2、顯示提示信息:“RDC 存儲器和控制系統不一致什么被更換了”時&#xf…

游戲代碼C

以下將結合不同編程語言的特點及游戲開發中的實際應用,展示多種語言的游戲代碼示例(以簡單游戲為例,展示代碼結構和邏輯差異)。由于代碼篇幅較長,我將分語言進行說明并引用相關來源: 1. C# Unity&#xff…

LangChain Agent核心解析:Zero-Shot-ReAct策略實現與實戰指南

引言 在LangChain的Agent框架中,zero-shot-react-description 是一種預定義的Agent類型,它結合了Zero-Shot(零樣本學習) 和 ReAct(推理行動) 策略,主要用于根據工具的描述動態選擇和執行工具&a…

PyQt 或 PySide6 進行 GUI 開發文檔與教程

一、官網文檔 Qt 官方文檔:Porting to Qt 6 | Qt 6.9Qt 維基:???????Qt WikiQt for Python (PySide6) :???????Qt for Python - Qt WikiPySide6 快速上手指南:???????Getting Started - Qt for Python PyS…

2024年第十五屆藍橋杯省賽B組Python【 簡潔易懂題解】

2024年第十五屆藍橋杯省賽B組Python題解 一、整體情況說明 2024年第十五屆藍橋杯省賽B組Python組考試共包含8道題目,分為結果填空題和程序設計題兩類。 考試時間:4小時編程環境:Python 3.x,禁止使用第三方庫,僅可使…