GO語言實現KMP算法

前言

本文結合朱戰立教授編著的《數據結構—使用c語言(第五版)》(以下簡稱為《數據結構(第五版)朱站立》)中4.4.2章節內容編寫,KMP的相關概念可參考此書4.4.2章節內容。原文中代碼是C語言,本文改用Go語言編寫,邏輯不變。

一、KMP介紹

?KMP算法?(Knuth-Morris-Pratt算法)是一種高效的字符串匹配算法,由D.E.Knuth、J.H.Morris和V.R.Pratt提出。該算法的核心在于利用匹配失敗后的信息,盡量減少模式串與主串的匹配次數,以達到快速匹配的目的。KMP算法的時間復雜度為O(m+n),其中m和n分別代表模式串和主串的長度。

二、求next數組

next數組是KMP算法中核心概念,求出next數組后,在模式串元素和主串元素比較的失敗的時候,可以將模式串t直接偏移到以next數組中的元素為下標的位置,主串指針不偏移,減少了元素比較次數,下面我們直接求next數組

舉例

字符串s=“ababbababcabac”
模式串t=“ababcab”
go語言版求next數組的代碼如下:

func GetNext(s string) []int {var next []int = make([]int, len(s))next[0] = -1next[1] = 0// j表示當前要求next值的位置// k表示當前要和前一個字符比對的下標j, k := 1, 0for j < len(s)-1 {if s[j] == s[k] {next[j+1] = k + 1k++j++} else if k == 0 {next[j+1] = 0j++} else {k = next[k]}}return next
}

執行上面代碼我們能獲取到next數組如下:

PS D:\Project\GoWorkSpace\DataStructure> go run .\0113\KMP_Algorithm.go
[-1 0 0 1 2 0 1]

注:以上代碼的變量名稱,邏輯均與《數據結構(第五版)朱站立》中內容一致,方便代碼閱讀

三、圖解KMP匹配過程

中間部分循環過程省略,主要看當模式串和主串不相等時,模式串如何偏移
字符串s=“ababbababcabac”
模式串t=“ababcab”
next數組=[-1 0 0 1 2 0 1]
在這里插入圖片描述
第一步:s數組元素和t數組元素一一對比,如果成功兩個數組下標偏移同時+1繼續比較,以此類推
在這里插入圖片描述
第二步:當s[4]≠t[4]時,next[4]=2,s數組不偏移,t數組偏移到t[2],比較s[4]和t[2]
在這里插入圖片描述
第三步:當s[4]≠t[2]時,next[2]=0,s數組不偏移,t數組偏移到t[0],比較s[4]和t[0]
在這里插入圖片描述
第四步:當s[4]≠t[0]時,由于t數組已經到第一位,所以s數組下標+1,比較s[5]和t[0]
在這里插入圖片描述
第五步:當s[5]=t[0]時,回到了第一步,兩個數組下標偏移同時+1繼續比較,以此類推;當t的下標為7時s的下標為12,循環結束打印t的第一個元素在s中下標的位置,即:12-7=5

四、Go示例代碼

package mainimport "fmt"func KMP(s string, t string) int {m := len(s)n := len(t)// s中當前比對的位置是i// t中當前比對的位置是ji, j := 0, 0next := GetNext(t)for i < m && j < n {if s[i] == t[j] {i++j++} else if j == 0 {i++} else {j = next[j] // t串偏移,偏移到next[j]下標}}if j == n { // t串全部匹配return i - j} else {return -1}
}
func GetNext(s string) []int {var next []int = make([]int, len(s))next[0] = -1next[1] = 0// j表示當前要求next值的位置// k表示當前要和前一個字符比對的下標j, k := 1, 0for j < len(s)-1 {if s[j] == s[k] {next[j+1] = k + 1k++j++} else if k == 0 {next[j+1] = 0j++} else {k = next[k]}}return next
}
func main() {t := "ababcab"fmt.Println(GetNext(t))fmt.Println(KMP("ababbababcabac", t))
}

運行結果

PS D:\Project\GoWorkSpace\DataStructure> go run .\0113\KMP_Algorithm.go
[-1 0 0 1 2 0 1]
5

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

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

相關文章

LeetCode 熱題 100_從前序與中序遍歷序列構造二叉樹(47_105_中等_C++)(二叉樹;遞歸)

LeetCode 熱題 100_從前序與中序遍歷序列構造二叉樹&#xff08;47_105&#xff09; 題目描述&#xff1a;輸入輸出樣例&#xff1a;題解&#xff1a;解題思路&#xff1a;思路一&#xff08;遞歸&#xff09;&#xff1a; 代碼實現代碼實現&#xff08;思路一&#xff08;遞歸…

1.2 ThreeJS能力演示——模型導入導出編輯

1、模型導入導出編輯能力 1&#xff09;支持導入基本類型模型 最常用&#xff0c;最適合作為web演示模型的是glb格式的&#xff0c;當前演示glb模型導入 // 1) 支持導入基本類型模型const loader new GLTFLoader();loader.load(./three.js-master/examples/models/gltf/Hors…

文檔智能:OCR+Rocketqa+layoutxlm <Rocketqa>

此次梳理Rocketqa&#xff0c;個人認為該篇文件講述的是段落搜索的改進點&#xff0c;關于其框架&#xff1a;粗檢索 重排序----&#xff08;dual-encoder architecture&#xff09;&#xff0c;講訴不多&#xff0c;那是另外的文章&#xff1b; 之前根據文檔智能功能&#x…

ESP8266 AP模式 網頁配網 arduino ide

ESP8266的AP配網,可以自行配置網絡,一個簡單的demo,文檔最后有所有的代碼,已經測試通過. 查看SPIFFS文件管理系統中的文件 賬號密碼是否存在,如不存在進入AP配網,如存在進入wifi連接模式 // 檢查Wi-Fi憑據if (isWiFiConfigured()) {Serial.println("找到Wi-Fi憑據&#…

ubuntu官方軟件包網站 字體設置

在https://ubuntu.pkgs.org/22.04/ubuntu-universe-amd64/xl2tpd_1.3.16-1_amd64.deb.html搜索找到需要的軟件后&#xff0c;點擊&#xff0c;下滑&#xff0c; 即可在Links和Download找到相關鏈接&#xff0c;下載即可&#xff0c; 但是找不到ros的安裝包&#xff0c; 字體設…

使用 WPF 和 C# 繪制覆蓋網格的 3D 表面

此示例展示了如何使用 C# 代碼和 XAML 繪制覆蓋有網格的 3D 表面。示例使用 WPF 和 C# 將紋理應用于三角形展示了如何將紋理應用于三角形。此示例只是使用該技術將包含大網格的位圖應用于表面。 在類級別&#xff0c;程序使用以下代碼來定義將點的 X 和 Z 坐標映射到 0.0 - 1.…

[Do374]Ansible一鍵搭建sftp實現用戶批量增刪

[Do374]Ansible一鍵搭建sftp實現用戶批量增刪 1. 前言2. 思路3. sftp搭建及用戶批量新增3.1 配置文件內容3.2 執行測試3.3 登錄測試3.4 確認sftp服務器配置文件 4. 測試刪除用戶 1. 前言 最近準備搞一下RHCA LV V,外加2.9之后的ansible有較大變化于是練習下Do374的課程內容. 工…

SK海力士(SK Hynix)是全球領先的半導體制造商之一,其在無錫的工廠主要生產DRAM和NAND閃存等存儲器產品。

SK海力士&#xff08;SK Hynix&#xff09;是全球領先的半導體制造商之一&#xff0c;其在無錫的工廠主要生產DRAM和NAND閃存等存儲器產品。以下是SK海力士的一些主要產品型號和類別&#xff1a; DRAM 產品 DDR4 DRAM 特點: 高速、低功耗&#xff0c;廣泛應用于PC、服務器和移…

WordPress如何配置AJAX以支持點擊加載更多?

WordPress 配置 AJAX 支持點擊加載更多內容通常涉及到前端 JavaScript 和服務器端的配合。以下是基本步驟&#xff1a; 安裝插件&#xff1a;你可以選擇一個現成的插件如 “Advanced Custom Fields” 或者 “WP Infinite Scroll”&#xff0c;它們已經內置了 AJAX 功能&#xf…

【IDEA 2024】學習筆記--文件選項卡

在我們項目的開發過程中&#xff0c;由于項目涉及的類過多&#xff0c;以至于我們會打開很多的窗口。使用IDEA默認的配置&#xff0c;個人覺得十分不便。 目錄 一、設置多個文件選項卡按照文件字母順序排列 二、設置多個文件選項卡分行顯示 一、設置多個文件選項卡按照文件字…

【C】數組和指針的關系

在 C 語言 和 C 中&#xff0c;數組和指針 有非常密切的關系。它們在某些情況下表現類似&#xff0c;但也有重要的區別。理解數組和指針的關系對于掌握低級內存操作和優化程序性能至關重要。 1. 數組和指針的基本關系 數組是一個 連續存儲的元素集合&#xff0c;在內存中占據一…

Maven 配置本地倉庫

步驟 1&#xff1a;修改 Maven 的 settings.xml 文件 找到你的 Maven 配置文件 settings.xml。 Windows: C:\Users\<你的用戶名>\.m2\settings.xmlLinux/macOS: ~/.m2/settings.xml 打開 settings.xml 文件&#xff0c;找到 <localRepository> 標簽。如果沒有該標…

Docker save load 鏡像 tag 為 <none>

一、場景分析 我從 docker hub 上拉了這么一個鏡像。 docker pull tomcat:8.5-jre8-alpine 我用 docker save 命令想把它導出成 tar 文件以便拷貝到內網機器上使用。 docker save -o tomcat-8.5-jre8-alpine.tar.gz 鏡像ID 當我把這個鏡像傳到別的機器&#xff0c;并用 dock…

O2O同城系統架構與功能分析

2015工作至今&#xff0c;10年資深全棧工程師&#xff0c;CTO&#xff0c;擅長帶團隊、攻克各種技術難題、研發各類軟件產品&#xff0c;我的代碼態度&#xff1a;代碼虐我千百遍&#xff0c;我待代碼如初戀&#xff0c;我的工作態度&#xff1a;極致&#xff0c;責任&#xff…

《盤古大模型——鴻蒙NEXT的智慧引擎》

在當今科技飛速發展的時代&#xff0c;華為HarmonyOS NEXT的發布無疑是操作系統領域的一顆重磅炸彈&#xff0c;其將人工智能與操作系統深度融合&#xff0c;開啟了智能新時代。而盤古大模型在其中發揮著至關重要的核心作用。 賦予小藝智能助手超強能力 在鴻蒙NEXT中&#xf…

走出實驗室的人形機器人,將復刻ChatGPT之路?

1月7日&#xff0c;在2025年CES電子展現場&#xff0c;黃仁勛不僅展示了他全新的皮衣和采用Blackwell架構的RTX 50系列顯卡&#xff0c;更進一步展現了他對于機器人技術領域&#xff0c;特別是人形機器人和通用機器人技術的篤信。黃仁勛認為機器人即將迎來ChatGPT般的突破&…

EF Core執行原生SQL語句

目錄 EFCore執行非查詢原生SQL語句 為什么要寫原生SQL語句 執行非查詢SQL語句 有SQL注入漏洞 ExecuteSqlInterpolatedAsync 其他方法 執行實體相關查詢原生SQL語句 FromSqlInterpolated 局限性 執行任意原生SQL查詢語句 什么時候用ADO.NET 執行任意SQL Dapper 總…

Java中網絡編程的學習

目錄 網絡編程概述 網絡模型 網絡通信三要素: IP 端口號 通信協議 IP地址&#xff08;Internet Protocol Address&#xff09; 端口號 網絡通信協議 TCP 三次握手 四次揮手 UDP TCP編程 客戶端Socket的工作過程包含以下四個基本的步驟&#xff1a; 服務器程序…

HarmonyOS NEXT開發進階(七):頁面跳轉

文章目錄 一、前言二、頁面跳轉三、頁面返回四、頁面返回前增加確認對話框4.1 系統的默認詢問框4.2 自定義詢問框 五、拓展閱讀 一、前言 APP開發過程中&#xff0c;多頁面跳轉場景十分常見&#xff0c;例如&#xff0c;登錄 -> 首頁 -> 個人中心。在鴻蒙開發中&#xf…

【Python】第一彈---解鎖編程新世界:深入理解計算機基礎與Python入門指南

?個人主頁&#xff1a; 熬夜學編程的小林 &#x1f497;系列專欄&#xff1a; 【C語言詳解】 【數據結構詳解】【C詳解】【Linux系統編程】【MySQL】【Python】 目錄 1、計算機基礎概念 1.1、什么是計算機 1.2、什么是編程 1.3、編程語言有哪些 2、Python 背景知識 2.…