串的模式匹配演算法

2021-07-11 05:11:34 字數 1174 閱讀 9194

1、brute-force模式匹配演算法(暴力匹配)

如果用暴力匹配的思路,並假設現在文字串s匹配到 i 位置,模式串p匹配到 j 位置,則有:

如果當前字元匹配成功(即s[i] == p[j]),則i++,j++,繼續匹配下乙個字元;

如果失配(即s[i]! = p[j]),令i = i - (j - 1),j = 0。相當於每次匹配失敗時,i 回溯,j 被置為0。

int indexstring(stringtype s , stringtype t , int

pos )

/* 採用順序儲存方式儲存主串s和模式t, */

/* 若模式t在主串s中從第pos位置開始有匹配的子串, */

/* 返回位置,否則返回-1

*/ else

/* 重新設定匹配位置 */

}if (j==t.length)

return(k-t.length) ; / * 匹配,返回位置 */

else

return(-1) ; /* 不匹配,返回-1 */

}//該演算法的時間複雜度為o(n*m) ,其中n 、 m分別是主串和模式串的長度。

2、kmp演算法(改進)

knuth-morris-pratt 字串查詢演算法,簡稱為 「kmp演算法」,常用於在乙個文字串s內查詢乙個模式串p 的出現位置,這個演算法由donald knuth、vaughan pratt、james h. morris三人於2023年聯合發表,故取這3人的姓氏命名此演算法。

下面先直接給出kmp的演算法流程(如果感到一點點不適,沒關係,堅持下,稍後會有具體步驟及解釋,越往後看越會柳暗花明☺):
假設現在文字串s匹配到 i 位置,模式串p匹配到 j 位置

如果j = -1,或者當前字元匹配成功(即s[i] == p[j]),都令i++,j++,繼續匹配下乙個字元;

如果j != -1,且當前字元匹配失敗(即s[i] != p[j]),則令 i 不變,j = next[j]。此舉意味著失配時,模式串p相對於文字串s向右移動了j - next [j] 位。

換言之,當匹配失敗時,模式串向右移動的位數為:失配字元所在位置 - 失配字元對應的next 值(next 陣列的求解會在下文的3.3.3節中詳細闡述),即移動的實際位數為:j - next[j],且此值大於等於1。

串的模式匹配演算法

子串的定位操作通常稱做串的模式匹配,這也是串的乙個很要的操作。一,一般定位子串位置演算法 演算法基本思想 從主串的第1個字元起和模式的第乙個字元進行比較,若相等,則再比較主串和模式串的後續字元。否則將主串的後續字元和模式串的第乙個字元進行比較,在網上找的一張 return i t.length 找到...

串的模式匹配演算法

串的模式匹配演算法 子串的定位操作通常稱作串的模式匹配。通常用函式index s,t,pos 來求解,其中s為主串,t為模式串,pos為主串中的位置,整個函式的作用是返回在字串s中的第pos個字元及以後 包含pos 首次出現與字串t相匹配的子串的第乙個字元的位置。例如 s abciu 5 abcjk...

串的模式匹配演算法

1 求子串位置的定位函式 子串的定位操作通常稱做串的模式匹配,是各種串處理系統中最重要的操作之一。現採用定長順序儲存結構,可以寫出簡單匹配演算法。int index sstring s,sstring t,int pos else if j t 0 return i t 0 else return ...