基本思想:從主串s尋找子串t,從s和t的第一個字符開始匹配,若匹配,則繼續第二個匹配,若到後面(匹配到第m位,未匹配完),則子串t回溯到第一個字符,主串回溯到第二個字符,繼續子串的第一個和主串的第二個匹配。。。。
僞代碼:
- 在串s和串t中設置比較的起始下標i和j;
重複下述操作,直到s或t的所有字符均比較完畢;
2.1 如果s[i]等於t[j],繼續比較s和t的下一對字符
2.1否則將下標i和j回溯,準備下一趟比較- 如果t中所有字符均比較完,則匹配成功,返回匹配的開始位置,否則,匹配失敗,返回0(約定返回0代表匹配失敗)
圖片來源於數據結構(C++版)清華大學出版社
下面是代碼的展示:
#include<iostream>
#include<string>
using namespace std;
int main() {
int BF(char s[],char t[]); //BF算法
char s[13] = {'a','a','a','a','a','a','a','a','a','a','b','c'}; //測試的主串
char t[3] = {'b','c'}; //匹配的子串
int aa=BF(s, t);
cout << aa;
return 0;
}
int BF(char s[],char t[]) {
int i =0,j=0;
while ((s[i]!='\0')&&t[j]!='\0') { //匹配的的主要過程
if (s[i]==t[j]) { //假如s[i]與t[j]相等,則繼續匹配
i++;
j++;
}
else { //假如s[i]與t[j]不相等,則回溯繼續匹配
i = i - j+1;
j = 0;
}
}
if (t[j] == '\0') { //匹配結束,判斷是否匹配成功
return i-j+1; //匹配成功,返回匹配的位置
}
else {
return 0; //匹配失敗,返回0
}
}
反思:假如我們足夠幸運,那麼我們匹配所花費的時間就是我們所花費的時間複雜度是o(n+m)
假如我們遇到了最壞的情況,那麼我們的時間複雜度就是o(n*m),在當今數據量暴漲的情況下,在很多情形下可能是不適用的,但好處就是容易理解,可以很快就寫出來了。