字串匹配的sunday演算法

2021-09-07 06:59:43 字數 1890 閱讀 1433

sunday演算法核心思想:啟發式移動搜尋步長!

sunday 演算法描述:

字串查詢演算法中,最著名的兩個是kmp演算法(knuth-morris-pratt)和bm演算法(boyer-moore)。這裡介紹一種比bm演算法更快一些的sunday查詢演算法。

例如我們要在"substring searching algorithm"查詢"search",剛開始時,把子串與文字左邊對齊:

substring searching algorithm

search

^結果在第二個字元處發現不匹配,於是要把子串往後移動。但是該移動多少呢?這就是各種演算法各顯神通的地方了,最簡單的做法是移動乙個字元位 置;kmp是利用已經匹配部分的資訊來移動;bm演算法是做反向比較,並根據已經匹配的部分來確定移動量。這裡要介紹的方法是看緊跟在當前子串之後的那個字 符(上圖中的 'i')。

顯然,不管移動多少,這個字元是肯定要參加下一步的比較的,也就是說,如果下一步匹配到了,這個字元必須在子串內。所以,可以移動子串,使子串中的 最右邊的這個字元與它對齊。現在子串'search'中並不存在'i',則說明可以直接跳過一大片,從'i'之後的那個字元開始作下一步的比較,如下圖:

substring searching algorithm

search

^比較的結果,第乙個字元就不匹配,再看子串後面的那個字元,是'r',它在子串中出現在倒數第三位,於是把子串向前移動三位,使兩個'r'對齊,如下:

substring searching algorithm

search

^哈!這次匹配成功了!回顧整個過程,我們只移動了兩次子串就找到了匹配位置,是不是很神啊?!可以證明,用這個演算法,每一步的移動量都比bm演算法要大,所以肯定比bm演算法更快。

因此,對於leetcode上的解題:

implement strstr().

returns the index of the first occurrence of needle

in haystack, or -1 if needle is

not part of haystack.

完整的python**如下:

class

solution(object):

defstrstr(self, haystack, needle):

""":type haystack: str

:type needle: str

:rtype: int

refer:

"""char_pos =dict()

for i, ch in

enumerate(needle):

char_pos[ch] =i

i =0

len1 =len(haystack)

len2 =len(needle)

while i <= len1 -len2:

found =true

for j, ch in

enumerate(needle):

if haystack[i+j] !=ch:

found =false

if (i+len2) if haystack[i+len2] not

inchar_pos:

i += (len2+1)

else

: i += (len2-char_pos[haystack[i+len2]])

else

:

return -1

break

iffound:

return

i

return -1

參考:

字串匹配 sunday演算法

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

字串匹配sunday演算法

在網上看到了一種比kmp和bm演算法還快字串匹配演算法,就看了一下,並且發現一些部落格上寫的 是錯誤的,於是我也寫了乙個,leetcode上測試通過。首先對sunday演算法進行一下講解 從別的地方複製過來的,講的確實不錯 好了,sunday演算法還真的很好理解,用下面的例子來說明吧 j k t h...

字串匹配 Sunday演算法

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