字串匹配sunday演算法

2021-07-10 07:08:26 字數 1741 閱讀 8390

在網上看到了一種比kmp和bm演算法還快字串匹配演算法,就看了一下,並且發現一些部落格上寫的**是錯誤的,於是我也寫了乙個,leetcode上測試通過。

首先對sunday演算法進行一下講解(從別的地方複製過來的,講的確實不錯)

好了,sunday演算法還真的很好理解,用下面的例子來說明吧:

j                                k

t h 

i s 

i s 

a s 

i m 

p l 

e e 

x a 

m p 

l e 

. e 

x a 

m p 

l e 

i      

這個例子中上面的字串是待查詢字串,下面的是子串。sunday的思想是這樣的:

首先i,j兩個指標指示的位置(也就是從頭開始匹配),當發現失配的時候就判斷子串的後一位在母串的字元(在上面的例子中是空格字元,k標記處)是否在子串中存在?如果存在則將該位置和子串中的該字元對齊,在從頭開始匹配。如果不存在就將子串向後移動,和母串k+1處的字元對齊,再進行匹配。重複上面的操作直到找到,或母串被找完結束。

對於上面的例子繼續進行,剛才說了失配,並且空格在子串中不存在,所以子串向後移動,子串的第乙個字元和母串的k+1位置的字元對齊,如下圖:

j                                 k

t h 

i s 

i s 

a s 

i m 

p l 

e e 

x a 

m p 

l e 

. e 

x a mp 

l e  i

這次比較還是失配,但是k位置的e在子串中出現了,而且第乙個就是,最後乙個也是,這時候一定要將子串中靠後出現的e和母串中的e對齊如下圖:

j                               k

t h 

i s 

i s 

a s 

i m 

p l 

e e 

x a 

m p 

l e 

. e x a

m p 

l e 

i為什麼是最靠後的乙個呢?如果這裡用第乙個e來和母串中的e對齊,就有可能將中間出現的可匹配字串空過去。

同上這次還是失配,所以還要再進行一次。 t 

h i 

s i 

s a 

s i 

m p 

l e 

e x 

a m 

p l 

e . ex 

amp l e 

這次就匹配成功了。

下面這段**也是我根據別人的稍加更改,leetcode28親測通過:

int solution::strstr(string haystack, string needle)

if(ni==n_len)

return hi;

pos=findletter(needle,haystack[hi+n_len]);

if(pos!=-1)//包含

else//不包含

} return -1; }

int solution::findletter(string needle,char p)

} return pos; }

字串匹配 sunday演算法

原題 lintcode題目 字串查詢 又稱查詢子字串 是字串操作中乙個很有用的函式。你的任務是實現這個函式。對於乙個給定的 source 字串和乙個 target 字串,你應該在 source 字串中找出 target 字串出現的第乙個位置 從0開始 如果不存在,則返回 1。字串匹配最常見的就是km...

字串匹配 Sunday演算法

字串匹配演算法中最先學的演算法是暴力演算法,緊接著是kmp演算法,到現在依舊沒有理解next到底是怎麼求的 尋找到了一種新的演算法 sunday演算法,比kmp演算法更快 匹配時關注匹配主串中參與匹配的最後一位字元的下一位字元。參考 include includeusing namespace st...

字串匹配演算法 Sunday

以往不論是上課還是各種資料書上,看到關於字串匹配的演算法,大抵都是kmp了。然而kmp的next陣列理解起來頗為費勁,且容易忘記。在leetcode刷題中偶然發現了乙個叫sunday的演算法,不僅容易理解,且經過其他博主測評,sunday的效率還要高於kmp演算法,因此本文記錄一下sunday演算法...