樸素匹配

        ## **樸素匹配** ##

何爲樸素匹配?
樸素匹配其實就是我們所熟知的暴力匹配,簡單的說,就是對主串進行遍歷,與匹配串每一個字符進行匹配,如果對應的字符不相等,主串後移,匹配串不動;
匹配過程中如果相等,兩個串同時向後移,如果將匹配串全部遍歷,則說明找到了,返回 主串現在位置減去字串長度;
匹配過程中如果不相等,則將主串返回到匹配到的下一個位置,匹配串返回到開始的位置,然後繼續往後匹配,直到主串全部遍歷。

理論是不是很繞呀,讓我用圖來爲大家解釋一下吧!

1,主串str 第一位開始,前二個字母都匹配成功
但str的第三位是c,而sub的第三位是a,匹配失敗,
豎線表示相等,X表示不相等。
這裏寫圖片描述
2,主串str第二位開始,主串str的首字母爲b,匹配串sub的首字母是a,匹配失敗。
這裏寫圖片描述
3,主串str第三位開始,主串str首字母爲c,匹配串sub的首字母爲a,匹配失敗。
這裏寫圖片描述
4,主串第四位開始,主串str與匹配串sub三個字母全部匹配完,匹配成功。
這裏寫圖片描述

這就是樸素匹配,就是對主串的每一個字符作爲子串開頭,與要匹配的字符串進行匹配。對主串做大循環,每個字符開頭做sub長度的小循環,直到匹配成功或全部遍歷。

接下來讓我用代碼展示一下樸素匹配:

#include<stdio.h>
#include<string.h>
#include<assert.h>

int BF(const char *str, const char *sub)
{
    assert(str != NULL && sub != NULL);
    int i = 0; //主串下標
    int j = 0; //匹配串下標
    int str_len = strlen(str);//主串長度
    int sub_len = strlen(sub);//匹配串長度
    if(sub_len > str_len || sub_len == 0)
        return -1;  //匹配串大於主串,無法匹配
    while(i < str_len && j < sub_len)
    {
        if(str[i] == sub[j]) //相等同時後移
        {
            i++;
            j++;
        }
        else //不相等
        {
            i = i - j + 1;//主串回溯到字串的下一個位置
            j = 0; //匹配串回到起始位置
        }
    }
    if(j >= sub_len)    
    {
        return i - j; //匹配成功  返回主串相應的位置
    } 
    return -1; //失敗返回-1
}

int main()
{
    char *str = "abcabac";
    char *sub = "aba";
    int m = BF(str,sub);
    printf("%d\n",m);    
    return 0;
}

這裏寫圖片描述

該樸素匹配函數返回的是匹配成功或主串的下標,失敗返回-1.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章