1. 程式人生 > >BF和KMP字串匹配演算法

BF和KMP字串匹配演算法

我們平時在使用 java 程式設計中,判斷一個字串是否包含另一個字串可以使用 String 自帶的方法或者正則表示式,但是indexOf可以返回早哪一個索引位置。

如果不用indexOf這個方法,入參是兩個字串,返回值是如果包含則返回開始包含的索引值,否則返回-1。

比較樸素的想法就是BF演算法,一遍遍比較過來不就行了嘛,如果遇到比如按照如下的思路

寫的程式碼可以如下:

有了BF演算法,但是大神覺得效率不是很高,因為之前已經做了一些比較,可以利用之前比較過的資訊,所以有了KMP演算法。這個演算法是由高德納和沃恩·普拉特在1974年構思,同年詹姆斯·H·莫里斯也獨立地設計出該演算法,最終由三人於1977年聯合發表,大神的演算法還是有點不好理解的

相對於BF演算法,其中用了next方法,因為移動的次數只和模式串有關,和目標串無關,不過還要好好想想為什麼是這麼做的。

我這裡只是拋磚引玉,因為我也是看下面的參考大神的部落格:

http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html

https://blog.csdn.net/v_july_v/article/details/7041827

https://www.zhihu.com/question/21923021

附:

我想BF演算法,是不是可以這麼實現,大家覺得有什麼問題?

相關推薦

BFKMP字串匹配演算法

我們平時在使用 java 程式設計中,判斷一個字串是否包含另一個字串可以使用 String 自帶的方法或者正則表示式,但是inde

串的樸素演算法KMP模式匹配演算法

串的樸素演算法和KMP模式匹配演算法   串的樸素演算法 (BF演算法又稱暴力搜尋):首先待匹配串與模式串首先左對齊,然後從左向右開始逐個進行匹配,如果出現失配情況,則從待匹配串下一個字元開始進行匹配,直到模式串匹配成功。   例如:   &nb

KMP字串匹配演算法

寫在前面 KMP演算法 典型例題 輸入 第一行一個整數N,表示測試資料組數。 接下來的N*2行,每兩行表示一個測試資料。在每一個測試資料中,第一行為模式串,由不超過10^4 個大寫字母組成,第二行為原串,由不超過10^6 個大寫字母組成。 其中N<=20

詳解KMP字串匹配演算法

字串匹配 字串匹配一般是指在較長的一個字串A中查詢是否含有較短字串B、B在A中的位置的過程。最容易想到、也是最長用的一種辦法是暴力匹配。String.contains() 用的就是這種方法,應該說這種簡單的方法用的還是特廣泛的。 KMP演算法 KMP演算法俗稱“看毛

KMP字串匹配演算法詳解

  KMP演算法利用匹配失敗後的資訊,儘量減少模式串與主串的匹配次數以達到快速匹配的目的。具體實現就是實現一個next()函式,函式本身包含了模式串的區域性匹配資訊。時間複雜度O(m+n)。 Next()函式的詳解 把將要進行next計算的字串S分成 k ,j 前後兩串,k代表前串開頭所在的序號,j

C/C++——樸素的模式匹配演算法KMP模式匹配演算法

樸素的模式匹配演算法 其實就是一個一個往下匹配,沒有任何優化,在好的情況下時間複雜度為O(n+m),在最求的情況下時間複雜度為O((n-m+1)*m)。 程式碼實現: //在主串s中找子串t,若找

資料結構- 串的模式匹配演算法 BF KMP演算法

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

字串匹配演算法---BFKMP

字串匹配的一般演算法(BF)   以 ABSABABCEF 與 ABCE 為例,求串2與串1匹配的第一個位置的下標(這裡即輸出 5),一般的,我們可以從串1的起始位置開始與串2比較,若相同則兩串都向後移,否則,串1回到第二個位置,串2回到起始位置重新比較。 程式碼:(

字串匹配演算法——KMP && BF

字串匹配操作定義: 目標串S="S0S1S2...Sn-1" , 模式串T=“T0T1T2...Tm-1” 對合法位置  0<= i <= n-m  (i稱為位移)依次將目標串的字串 S[i ... i+m-1] 和模式串T[0 ... m-1] 進行比較,若

字串匹配演算法(KMP、BMSunday),及Python實現

主要對三種字串匹配演算法(KMP、BM、Sunday)進行總結。這三種字串匹配演算法之間的主要區別在於:如果在匹配過程中遇到一個不匹配位,該用何種策略進行移位。例如,存在兩個字串,如下: 字串:      ABCADAB ABCDABCDABD 搜尋字串:ABCDA

字串匹配演算法BF KMP

BF演算法(樸素演算法): 思路: 子串的定位操作通常稱做模式匹配,其中子串稱做模式串,主串稱做目標串,樸素的模式匹配演算法即是模式匹配的一種演算法,其優點是簡單易懂,易於理解,某些應用場合

字串匹配演算法KMP演算法詳情

package demo; /* 字串匹配演算法 */ public class StringKMP { //找出從第一個字元開始 子串T在主串S的第一個位置 如果沒有則返回-1 public static int index(String S, String T)

KMP Algorithm 字串匹配演算法KMP小結

這篇小結主要是參考這篇帖子從頭到尾徹底理解KMP,不得不佩服原作者,寫的真是太詳盡了,讓博主產生了一種讀學術論文的錯覺。後來發現原作者是寫書的,不由得更加敬佩了。博主不才,嘗試著簡化一些原帖子的內容,希望能更通俗易懂一些。博主的帖子一貫秉持通俗易懂的風格,使得非CS專業的人士也能讀懂,至少博主自己是這麼認

字串匹配演算法——KMP演算法

KMP演算法是一種改進的字串匹配演算法。KMP演算法的關鍵是利用匹配失敗後的資訊,儘量減少模式串與主串的匹配次數以達到快速匹配的目的。具體實現就是實現一個next()函式,函式本身包含了模式串的區域性匹配資訊。   下面從一個例子來了解KMP演算法:字串"BBC ABCDAB ABCD

KMP演算法字串匹配演算法

KMP演算法主要是要計算匹配字元的字首表(prefix table), 舉例:如下面字串的字首表就是陰影框框中的部分。利用字首表來進行匹配  例子:(匹配字元)p=ABABCABAA, (待匹配字元)t=ABABABABCABAAB 具體主要就是求字首表,然後將

KMP演算法:O(n)線性時間字串匹配演算法

KMP演算法包括兩個子程式。其中KMP-MATCHER指字串匹配子程式,COMPUTE-PREFIX則為部分匹配表NEXT[]生成程式。《演算法導論》一書中有一句話,我認為說的非常透徹:“這兩個程式有很多相似之處,因為它們都是一個字串對模式P的匹配:KMP-MATCHER是文字T針對模式P的

KMP演算法(改進的字串匹配演算法

/** *KMP演算法 */ /* 目標串:ababcabcbababcabacaba 模式串:ababcabac next:001201230 首先獲取模式串的next陣列,next陣列實際是計算出模式串中重複出現的字元數量

淺談單模式串字串匹配演算法KMP

字串演算法很有趣,尤其是KMP和AC自動機~~ 大綱 1.問題定義 字串匹配是電腦科學中最古老、研究最廣泛的問題之一。一個字串是一個定義在有限字母表∑上的字元序列。例如,ATCTAGAGA是字母表∑ = {A,C,G,T}上的一個字串。字串匹配問題就是在一個大的字串

字串匹配演算法KMP總結

字串匹配有很多方法,比如暴力,雜湊等等,還有一種廣為人知的演算法 − − −

字串匹配演算法——KMP演算法簡單解釋

一、字串匹配演算法KMP KMP演算法是一種改進的字串匹配演算法,由D.E.Knuth,J.H.Morris和V.R.Pratt同時發現,因此人們稱它為克努特——莫里斯——普拉特操作(簡稱KMP演算法)。KMP演算法的關鍵是利用匹配失敗後的資訊,儘量減少模式串