## **樸素匹配** ##
何爲樸素匹配?
樸素匹配其實就是我們所熟知的暴力匹配,簡單的說,就是對主串進行遍歷,與匹配串每一個字符進行匹配,如果對應的字符不相等,主串後移,匹配串不動;
匹配過程中如果相等,兩個串同時向後移,如果將匹配串全部遍歷,則說明找到了,返回 主串現在位置減去字串長度;
匹配過程中如果不相等,則將主串返回到匹配到的下一個位置,匹配串返回到開始的位置,然後繼續往後匹配,直到主串全部遍歷。
理論是不是很繞呀,讓我用圖來爲大家解釋一下吧!
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.