如何實(shí)作C#中的KMP演算法
Sep 19, 2023 pm 01:31 PM如何實(shí)作C#中的KMP演算法
KMP(Knuth-Morris-Pratt)演算法,是一種高效的字串比對(duì)演算法,用於在文字串中尋找模式串的位置。它的核心思想是利用已匹配的部分訊息,避免不必要的比較。
實(shí)作KMP演算法的關(guān)鍵是建立一個(gè)部分匹配表(Partial Match Table),也叫做next陣列。這個(gè)陣列記錄了模式字串中每個(gè)前綴子字串的最長(zhǎng)可匹配後綴子字串的長(zhǎng)度。
下面是C#中實(shí)作KMP演算法的具體步驟與程式碼範(fàn)例:
步驟一:建構(gòu)部分符合表
- 定義一個(gè)大小為模式串長(zhǎng)的整數(shù)陣列next,並初始化next[0] = -1。
- 定義兩個(gè)指標(biāo) i 和 j,初始值分別為 0 和 -1。
- 判斷i 是否達(dá)到模式字串的結(jié)尾,若沒(méi)有則執(zhí)行下列步驟:
a. 若j 等於-1 或目前字元和指標(biāo)j 對(duì)應(yīng)的字元相等,則i 和j 同時(shí)後移,並將next[i] = j。
b. 否則,將指標(biāo) j 移到 next[j] 的位置,繼續(xù)進(jìn)行比對(duì)。 - 傳回建立好的部分符合表 next。
以下是如何實(shí)現(xiàn)上述步驟的程式碼:
private int[] BuildNext(string pattern) { int[] next = new int[pattern.Length]; next[0] = -1; int i = 0, j = -1; while (i < pattern.Length - 1) { if (j == -1 || pattern[i] == pattern[j]) { i++; j++; next[i] = j; } else { j = next[j]; } } return next; }
步驟二:使用部分匹配表進(jìn)行匹配
- 定義兩個(gè)指標(biāo)i 和j ,分別指向文字串和模式串的起始位置。
- 判斷 i 和 j 是否達(dá)到結(jié)尾,若沒(méi)有則執(zhí)行下列步驟:
a. 若 j 等於 -1 或目前字元和指標(biāo) j 對(duì)應(yīng)的字元相等,則 i 和 j 同時(shí)後移。
b. 否則,將指標(biāo) j 移到 next[j] 的位置,繼續(xù)進(jìn)行比對(duì)。 - 若指標(biāo) j 指向模式字串的結(jié)尾,表示符合成功,傳回起始位置在文字字串中的索引。
- 若符合失敗,則回傳 -1。
以下是如何實(shí)現(xiàn)上述步驟的程式碼:
private int KMP(string text, string pattern) { int[] next = BuildNext(pattern); int i = 0, j = 0; while (i < text.Length && j < pattern.Length) { if (j == -1 || text[i] == pattern[j]) { i++; j++; } else { j = next[j]; } } if (j == pattern.Length) { return i - j; } return -1; }
透過(guò)呼叫 KMP 方法,並傳入文字串和模式串,即可獲得匹配結(jié)果。
以上就是如何在C#中實(shí)作KMP演算法的步驟和程式碼範(fàn)例。透過(guò)利用部分匹配表,KMP演算法能夠有效地提高字串匹配的效率,特別是在處理大文本串和長(zhǎng)模式字串時(shí),具有較好的效能表現(xiàn)。
以上是如何實(shí)作C#中的KMP演算法的詳細(xì)內(nèi)容。更多資訊請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

熱AI工具

Undress AI Tool
免費(fèi)脫衣圖片

Undresser.AI Undress
人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門(mén)文章

熱工具

記事本++7.3.1
好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強(qiáng)大的PHP整合開(kāi)發(fā)環(huán)境

Dreamweaver CS6
視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版
神級(jí)程式碼編輯軟體(SublimeText3)

如何使用C#編寫(xiě)時(shí)間序列預(yù)測(cè)演算法時(shí)間序列預(yù)測(cè)是一種透過(guò)分析過(guò)去的資料來(lái)預(yù)測(cè)未來(lái)資料趨勢(shì)的方法。它在許多領(lǐng)域,如金融、銷售和天氣預(yù)報(bào)中有廣泛的應(yīng)用。在本文中,我們將介紹如何使用C#編寫(xiě)時(shí)間序列預(yù)測(cè)演算法,並附上具體的程式碼範(fàn)例。資料準(zhǔn)備在進(jìn)行時(shí)間序列預(yù)測(cè)之前,首先需要準(zhǔn)備好資料。一般來(lái)說(shuō),時(shí)間序列資料應(yīng)該具有足夠的長(zhǎng)度,並且是按照時(shí)間順序排列的。你可以從資料庫(kù)或者

如何使用C#編寫(xiě)廣度優(yōu)先搜尋演算法廣度優(yōu)先搜尋(Breadth-FirstSearch,BFS)是一種常用的圖搜尋演算法,用於在一個(gè)圖或樹(shù)中按照廣度進(jìn)行遍歷。在這篇文章中,我們將探討如何使用C#編寫(xiě)廣度優(yōu)先搜尋演算法,並提供具體的程式碼範(fàn)例。演算法原理廣度優(yōu)先搜尋演算法的基本原理是從演算法的起點(diǎn)開(kāi)始,逐層擴(kuò)展搜尋範(fàn)圍,直到找到目標(biāo)或遍歷完整個(gè)圖。它通常透過(guò)隊(duì)列來(lái)實(shí)現(xiàn)。

如何實(shí)作C#中的貪心演算法貪心演算法(Greedyalgorithm)是一種常用的問(wèn)題解法,它每次選擇目前最優(yōu)的解決方案,希望能夠獲得全域最優(yōu)解。在C#中,我們可以利用貪心演算法解決許多實(shí)際問(wèn)題。本文將介紹如何在C#中實(shí)作貪心演算法,並提供具體的程式碼範(fàn)例。一、貪心演算法的基本原理貪心演算法的基本思想是每次都選擇當(dāng)前最優(yōu)的解決方案,而不考慮後續(xù)步驟可能的影響。這種思

如何使用C#來(lái)寫(xiě)霍夫曼編碼演算法引言:霍夫曼編碼演算法是一種用於資料壓縮的無(wú)損演算法。在資料傳輸或儲(chǔ)存時(shí),透過(guò)對(duì)頻率較高的字元使用較短的編碼,對(duì)頻率較低的字元使用較長(zhǎng)的編碼,從而實(shí)現(xiàn)對(duì)資料進(jìn)行有效壓縮。本文將介紹如何使用C#編寫(xiě)霍夫曼編碼演算法,並提供具體的程式碼範(fàn)例?;舴蚵幋a演算法的基本原理霍夫曼編碼演算法的核心思想是建立一顆霍夫曼樹(shù)。首先,透過(guò)統(tǒng)計(jì)字元出現(xiàn)的頻率,將

如何實(shí)現(xiàn)C#中的最短路徑演算法,需要具體程式碼範(fàn)例最短路徑演算法是圖論中的重要演算法,用於求解一個(gè)圖中兩個(gè)頂點(diǎn)之間的最短路徑。在本文中,我們將介紹如何使用C#語(yǔ)言實(shí)作兩種經(jīng)典的最短路徑演算法:Dijkstra演算法和Bellman-Ford演算法。 Dijkstra演算法是一種廣泛應(yīng)用的單源最短路徑演算法。它的基本想法是從起始頂點(diǎn)開(kāi)始,逐步擴(kuò)展到其他節(jié)點(diǎn),更新已經(jīng)發(fā)現(xiàn)的節(jié)點(diǎn)

如何使用C#編寫(xiě)深度學(xué)習(xí)演算法引言:隨著人工智慧的快速發(fā)展,深度學(xué)習(xí)技術(shù)在許多領(lǐng)域取得了突破性的成果。為了實(shí)現(xiàn)深度學(xué)習(xí)演算法的編寫(xiě)和應(yīng)用,目前最常用的語(yǔ)言是Python。然而,對(duì)於喜歡使用C#語(yǔ)言的開(kāi)發(fā)者來(lái)說(shuō),使用C#編寫(xiě)深度學(xué)習(xí)演算法也是可行的。本文將介紹如何使用C#編寫(xiě)深度學(xué)習(xí)演算法,並提供具體的程式碼範(fàn)例。一、創(chuàng)建C#專案在開(kāi)始編寫(xiě)深度學(xué)習(xí)演算法之前,首先需要?jiǎng)?chuàng)建

如何使用C#編寫(xiě)最小生成樹(shù)演算法最小生成樹(shù)演算法是一種重要的圖論演算法,它用於解決圖的連結(jié)性問(wèn)題。在電腦科學(xué)中,最小生成樹(shù)是指一個(gè)連通圖的生成樹(shù),該生成樹(shù)的所有邊的權(quán)值總和最小。本文將介紹如何使用C#編寫(xiě)最小生成樹(shù)演算法,並提供具體的程式碼範(fàn)例。首先,我們需要定義一個(gè)圖的資料結(jié)構(gòu)來(lái)表示問(wèn)題。在C#中,可以使用鄰接矩陣來(lái)表示圖。鄰接矩陣是一個(gè)二維數(shù)組,其中每個(gè)元素表示

如何使用C#編寫(xiě)快速排序演算法快速排序演算法是一種高效的排序演算法,它的想法是透過(guò)分治的想法將陣列分成較小的子問(wèn)題,然後遞歸地解決這些子問(wèn)題,最後將它們合併起來(lái)得到整個(gè)問(wèn)題的解答。下面我們將詳細(xì)介紹如何使用C#編寫(xiě)一個(gè)快速排序演算法,並給出相關(guān)的程式碼範(fàn)例。演算法思路快速排序的想法可以總結(jié)為以下三個(gè)步驟:選擇一個(gè)基準(zhǔn)元素,一般選擇數(shù)組的第一個(gè)元素;將數(shù)組中小於基準(zhǔn)元素的
