Sunday演算法 查詢字串

2021-10-03 13:19:03 字數 2559 閱讀 5829

sunday演算法是用於查詢子串的一種演算法,具體的應用場景看這裡

相比於kmp,bm演算法,sunday演算法更快,並且更好理解(自認為哈

下面用比較正式的語言介紹一下該演算法:

原字串為文字串,匹配的子串為模式串

從前往後匹配,在匹配失敗時,關注的是文字串中參加匹配的最末位字元的下一位字元

—如果該字元沒有在模式串**現則直接跳過,即移動位數 = 匹配串長度 + 1;

—否則,其移動位數 = 模式串中最右端的該字元到末尾的距離+1。

是不是看的一腦袋問號?事實上在學習乙個演算法時,我認為不應該一開始就看概念,而是從例子入手。讀懂了例子,就有事半功倍的效果。

話不多說,舉乙個栗子:

令文字串為:"substring searching algorithm

令模式串為:search

1.初始狀態:

現在匹配失敗了,那麼我們要試圖移動模式串,再進行下一次匹配

(事實上我覺得各個演算法不同的地方就在於怎麼移動模式串)

sunday演算法選擇關注文字串中參加匹配的最末位字元的下一位字元

在這裡,就是箭頭指向的 i 。可以看到,i 沒有出現在模式串search中。

所以,我們可以說,文字串中所有包括i的部分,都不會與search匹配。

2.移動模式串

這樣我們可以直接將search直接移動到 i 的後面。從i後面的元素n開始匹配。

ok,現在模式串search還是沒有與文字串匹配。我們繼續關注上文所說的「下一位字元」,也就是箭頭所指的 r。

r出現在了模式串中,出現在模式串的倒數第3位。

那麼我們將模式串向右移動3位。也就是將兩個r先匹配起來.

3.移動模式串

這裡,匹配成功了。完結撒花~~

現在,回頭看看該演算法的定義,會不會豁然開朗了呢?

接下來就上**了~

class

solution

:def

strstr

(self, haystack:

str, needle:

str)

->

int:

defcalshiftmat

(st)

: dic =

for i in

range

(len

(st)-1

,-1,

-1):

ifnot dic.get(st[i]):

dic[st[i]]=

len(st)

-i dic[

"ot"]=

len(st)+1

return dic

# 關於這個函式,我覺得就是為了降低時間複雜度的

# 之前我是用in和index來判斷「下一位字元」以及移動的距離。

# 但leetcode過不了..

ifnot needle:

return

0 len_a =

len(haystack)

len_b =

len(needle)

dic = calshiftmat(needle)

start =

0while start <= len_a - len_b:

if haystack[start:start+len_b]

== needle:

return start # 如果匹配,直接返回起始位置

else

:if start+len_b >= len_a:

return-1

cur_c = haystack[start+

len(needle)

]if dic.get(cur_c)

: start += dic[cur_c]

else

: start += dic[

"ot"

]return-1

if start+

len(needle)

>=

len(haystack)

else start

KMP演算法查詢字串

使用kmp演算法查詢字串,時間效率為o m n include include include kmp演算法尋找字串匹配,時間效率為o m n void cmpnext const char pattern,int next next演算法 int main int argc,char argv e...

查詢字串

在乙個主串中查詢相應的子串,如 abcdwoshidef 中查詢 woshi 方法 該實現的方法是最簡單的模式匹配方法,時間複雜度較高 include iostream using namespace std int searchstring const char str1,const char s...

查詢字串

qstring startwith 判斷乙個字串是否以某個字串開頭,引數 字串,大小寫敏感 qstring str welcome to you str.startswith welcome qt casesensitive 返回true str.startswith you qt casesens...