字串匹配演算法

2021-10-02 10:20:59 字數 2197 閱讀 6347

給定兩個字串a和b,請判斷b是否是a的子串。

如果是,返回b在a中第一次出現的位置;

如果不是,返回-1。

什麼意思呢?我們來舉乙個例子:

字串a: a b b c e f g h 

字串b: b c e

字串b是a的子串,b第一次在a**現的位置下標是2,所以返回2

字串a: a b c d e f g h 

字串b: a d e g

字串b在a中並不存在,所以返回-1

為了統一概念,在後文中,我們把字串a稱為主串,把字串b稱為模式串

bf演算法

rk演算法

kmp演算法

sunday演算法

brute force(暴力演算法)的縮寫。

直接從頭開始,把主串和模式串的字元逐個進行匹配,如果發現不匹配,再從主串下一位開始,比較簡單粗暴。

第一輪,從主串的第0位開始,把主串和模式串的字元逐個比較:

顯然兩者並不匹配。

第二輪,把模式串後移一位,從主串的第1位開始,把主串和模式串的字元逐個比較:

主串的第1位字元是b,模式串的第1位字元也是b,兩者匹配,繼續比較:

主串的第2位字元是b,模式串的第2位字元是c,兩者並不匹配。

第三輪,把模式串再次後移一位,從主串的第2位開始,把主串和模式串的字元逐個比較:

主串的第2位字元是b,模式串的第2位字元也是b,兩者匹配,繼續比較:

主串的第3位字元是c,模式串的第3位字元也是c,兩者匹配,繼續比較:

主串的第4位字元是e,模式串的第4位字元也是e,兩者匹配,比較完成。

由此得到結果,模式串 bce 是主串 abbcefgh 的子串,在主串第一次出現的位置下標是 2:

cout平均效能的時間複雜度為o(n),最差情況的時間複雜度為o(nm)

sunday演算法的掃瞄順序是沒有限制的。為了提高在最壞情況下的演算法效率,可以對模式串中的字元按照其出現的概率從小到大的順序掃瞄,這樣能盡早地確定失配與否。

nefu oj:

hdu:

字串匹配演算法 字串匹配演算法總覽

字串匹配在文字處理裡非常重要,我們採用簡潔的python 把以下演算法一一實現並講解。樸素演算法 algorithm rabin karp 演算法 有限自動機演算法 finite automation knuth morris pratt 演算法 kmp algorithm boyer moore ...

字串匹配演算法

首先引用一下另一篇文章中對字串匹配的介紹 字串匹配指的是從文字中找出給定字串 稱為模式 的乙個或所有出現的位置。本文的演算法一律輸出全部的匹配位 置。模式串在 中用x m 來表示,文字用y n 來,而所有字串都構造自乙個有限集的字母表 其大小為 根 據先給出模式還是先給出文字,字串匹配分為兩類方法 ...

字串匹配演算法

平常操作文字的時候,經常需要操作對字串進行操作。而字串中最重要的一種操作就叫匹配,字串的匹配演算法很多,人們最熟悉的莫過於kmp演算法了。今天就來談一談一些字串匹配演算法。先來說說大名鼎鼎的kmp演算法,這個演算法出現在無數的資料結構與演算法書上面。它的策略很簡單 當模式串第k個字元不匹配主串中第s...