BF算法 KMP算法(普通、快速模式匹配算法)及C語言

判斷兩個串之間是否存在主串與子串的關(guān)系嘱支,這個過程稱為串的模式匹配蚓胸。

  • 在串的模式匹配過程,子串 T 通常被叫做“模式串”除师。

普通的模式匹配(“BF”算法)

判斷兩個串是否存在子串與主串的關(guān)系沛膳,最直接的算法就是拿著模式串,去和主串從頭到尾一一比對汛聚,這就是“BF”算法的實現(xiàn)思想锹安。

將提供的模式串(例如 “abcac” )從主串的第一個字符開始,依次判斷相同位置的字符是否相等,如果全部相等叹哭,則匹配成功忍宋;反之,將子串向后移動一個字符的位置风罩,繼續(xù)與主串中對應(yīng)的字符匹配糠排。

算法運行過程:(圖中,i 和 j 表示匹配字符在數(shù)組中的位置下標(biāo))

如圖所示超升,第一次匹配入宦,模式串和主串匹配到第三個字符時,匹配失斃蟆云石;模式串向右移動一個字符的位置,還是從第一個字符 ‘a(chǎn)’ 和主串的第二個字符 ‘b’ 相匹配研乒,匹配失敗淋硝;模式串繼續(xù)后移一個字符的位置雹熬,繼續(xù)匹配。

#include <stdio.h>
#include <string.h>
int sel(char * S,char *T){
    int i=0,j=0;
    while (i<strlen(S) && j<strlen(T)) {
        if (S[i]==T[j]) {
            i++;
            j++;
        }else{
            i=i-j+1;
            j=0;
        }
    }
    //跳出循環(huán)有兩種可能谣膳,i=strlen(S)說明已經(jīng)遍歷完主串竿报;j=strlen(T),說明模式串遍歷完成,在主串中成功匹配
    if (j==strlen(T)) {
        return i-strlen(T)+1;
    }
    //運行到此继谚,為i==strlen(S)的情況
    return 0;
}
int main() {
    int add=sel("ababcabcacbab", "abcac");
    printf("%d",add);
    return 0;
}

時間復(fù)雜度

“BF” 算法在最理想的情況下的時間復(fù)雜度為O(m)( m 是模式串的長度烈菌,也就是第一次匹配就成功的情況)。

一般情況下花履,"BF"算法的時間復(fù)雜度為O(n+m)(n是主串的長度芽世,m是模式串的長度)。

最壞的情況下的時間復(fù)雜度為O(nm)(例如主串 S 為“000000000001”诡壁,模式串 T ”001”,每次匹配時济瓢,直到匹配最后一個元素,才得知匹配失敗妹卿,運行了 nm 次)旺矾。

KMP算法

串的普通模式匹配算法,大體思路是:模式串從主串的第一個字符開始匹配夺克,每匹配失敗箕宙,主串中記錄匹配進(jìn)度的指針 i 都要進(jìn)行 i-j+1 的回退操作(這個過程稱為“指針回溯”),同時模式串向后移動一個字符的位置铺纽。一次次的循環(huán)柬帕,直到匹配成功或者程序結(jié)束。

"KMP"算法相比于"BF"算法,優(yōu)勢在于:
在保證指針 i 不回溯的前提下雕崩,當(dāng)匹配失敗時魁索,讓模式串向右移動最大的距離;
并且可以在O(n+m)的時間數(shù)量級上完成對串的模式匹配操作盼铁;

故粗蔚,"KMP"算法稱為“快速模式匹配算法”。

next函數(shù)實現(xiàn)

#include <stdio.h>
#include <string.h>
void Next(char*T,int *next){
    int i=1;
    next[0]=0;
    int j=0;
    while (i<strlen(T)) {
        if (j==0||T[i-1]==T[j-1]) {
            i++;
            j++;
            next[i]=j;
        }else{
            j=next[j];
        }
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末饶火,一起剝皮案震驚了整個濱河市鹏控,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌肤寝,老刑警劉巖当辐,帶你破解...
    沈念sama閱讀 222,464評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異鲤看,居然都是意外死亡缘揪,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評論 3 399
  • 文/潘曉璐 我一進(jìn)店門义桂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來找筝,“玉大人,你說我怎么就攤上這事慷吊⌒湓#” “怎么了?”我有些...
    開封第一講書人閱讀 169,078評論 0 362
  • 文/不壞的土叔 我叫張陵溉瓶,是天一觀的道長急鳄。 經(jīng)常有香客問我,道長堰酿,這世上最難降的妖魔是什么疾宏? 我笑而不...
    開封第一講書人閱讀 59,979評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮胞锰,結(jié)果婚禮上灾锯,老公的妹妹穿的比我還像新娘。我一直安慰自己嗅榕,他們只是感情好顺饮,可當(dāng)我...
    茶點故事閱讀 69,001評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著凌那,像睡著了一般兼雄。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上帽蝶,一...
    開封第一講書人閱讀 52,584評論 1 312
  • 那天赦肋,我揣著相機(jī)與錄音,去河邊找鬼。 笑死佃乘,一個胖子當(dāng)著我的面吹牛囱井,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播趣避,決...
    沈念sama閱讀 41,085評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼庞呕,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了程帕?” 一聲冷哼從身側(cè)響起住练,我...
    開封第一講書人閱讀 40,023評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎愁拭,沒想到半個月后讲逛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,555評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡岭埠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,626評論 3 342
  • 正文 我和宋清朗相戀三年盏混,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片枫攀。...
    茶點故事閱讀 40,769評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡括饶,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出来涨,到底是詐尸還是另有隱情,我是刑警寧澤启盛,帶...
    沈念sama閱讀 36,439評論 5 351
  • 正文 年R本政府宣布蹦掐,位于F島的核電站,受9級特大地震影響僵闯,放射性物質(zhì)發(fā)生泄漏卧抗。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,115評論 3 335
  • 文/蒙蒙 一鳖粟、第九天 我趴在偏房一處隱蔽的房頂上張望社裆。 院中可真熱鬧,春花似錦向图、人聲如沸泳秀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嗜傅。三九已至,卻和暖如春檩赢,著一層夾襖步出監(jiān)牢的瞬間吕嘀,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留偶房,地道東北人趁曼。 一個月前我還...
    沈念sama閱讀 49,191評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像棕洋,于是被迫代替她去往敵國和親挡闰。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,781評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 字符串匹配KMP算法詳解 1. 引言 以前看過很多次KMP算法拍冠,一直覺得很有用尿这,但都沒有搞明白,一方面是網(wǎng)上很少有...
    張晨輝Allen閱讀 2,411評論 0 3
  • 串匹配算法也稱作模式匹配算法庆杜,就是在目標(biāo)字符串中查找子字符串射众,常用于文本搜索、入侵檢測等領(lǐng)域晃财,將目標(biāo)字符串定義為T...
    效宇笑語閱讀 1,426評論 0 1
  • ??在文本處理中叨橱,關(guān)鍵字匹配是一個十分常用且重要的功能。關(guān)鍵字稱為模式串断盛,在文本T中尋找模式串P出現(xiàn)的所有出現(xiàn)的位...
    老羊_肖恩閱讀 4,516評論 1 4
  • 人生最好的辦法就是忘記 忘記不開心 忘記心疼 忘記那些不開心 統(tǒng)統(tǒng)放棄 然后開始新的征程 這些日子我想明白了 一味...
    空南宮雨香閱讀 152評論 1 0
  • 名詞解釋:即興戲劇也叫即興喜劼尴础(Improve Comedy)---它不需要排練、不需要劇本钢猛,通過演員在舞臺上的即...
    丁凡13閱讀 1,133評論 2 6