字串的模式匹配問題

2021-07-24 14:29:22 字數 1870 閱讀 8769

針對字串的模式匹配問題,解決的演算法有挺多的,下面就把我所知道的一一介紹吧。

第一種,樸素模式匹配(時間複雜度為o(mn))

之所以把這種演算法稱作樸素模式匹配,我想大概是因為這個演算法可以看做是在通過遍歷,從而完成匹配,這種方式應該是比較樸素的。(個人看法)

舉例來說吧。

主串s = 「abcdabcde」,子串t = 「abcde」

(1)從主串第乙個字元開始,和子串中的字元進行逐一比較,可以發現前四個字元都匹配成功,而第四個沒有匹配成功;

(2)主串的開始下標+1,然後再繼續跟子串匹配(子串從0下標開始);

(3)沒有匹配成功,就重複第二步,直到全部匹配成功,或者說主串s已到達末尾。

實現**:

private static int ******(string s, string t)  else 

}// 匹配成功,返回模式串p在文字串s中的位置,否則返回-1

if (j == t.length())

return i - j;

else

return -1;

}

第二種,快速模式匹配(時間複雜度為o(n))

快速模式匹配演算法,實現了保持主串的檢索位置不懂,而移動子串的檢索位置,省去了一些不必要的操作,提高了效率。而要想確定子串的檢索位置應該怎麼移動,就需要了解幾個概念:字首、字尾。舉個例子來說吧,給定字串「abcdabd」,

也就是說,原模式串子串對應的各個字首字尾的公共元素的最大長度表為:

這個表其實就是next陣列的前身,把表中資料都往後移一位,並在首位填上-1,即:

其實整個kmp演算法的實現,我覺得關鍵就在於如何獲得next陣列,next陣列其實就是查詢模式串中每一位前面的子串的前字尾有多少位匹配,從而決定在失配時子串檢索位置應該回退到哪個位置,那接下來就來推敲一下,如何獲得next陣列吧。

由於我個人的表達能力有限,建議參考講的很清楚,通俗易懂。

**實現:

public static int getnext(string t)  else 

} return next;

} public static int kmp(string s, string t) else

} if (j == t.length()) else

}

第三種,boyer-moore 演算法,簡稱 bm 演算法。

bm 演算法定義了兩個規則:

第四種,sunday演算法。

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

字串模式匹配

include include include include include includeusing namespace std inline unsigned int64 getclock const char min a const int characters 26 int shiftta...

字串模式匹配

子串的定位操作通常稱作串的模式匹配,是各種串處理系統中最重要的操作之一。設有2 個串 主串 s和子串 t,串的簡單模式匹配演算法是 從主串 s 中的第乙個字元開始和子串 t中的第乙個字元比較,分別用i和 j 指示s串和 t串中正在比較的字元的位置。若相等,則繼續逐個比較後續字元 否則從主串 s的第二...

字串模式匹配

bf演算法 我們常用的暴力演算法,時間複雜度o n2 o n 2 演示 int bf const char text,const char pattern if flag return 1 return 0 kmp演算法 基於bf演算法的優化,他根據字串出現字首與字尾相同的情況進行優化 假設這裡sa...