O(mn) (m=模式長, n=文本長)2n從文本位置 0 到 n-m 依次嘗試匹配。每次從模式串起始位置比較,若失敗則模式串右移一位繼續。無預處理,空間 O(1)。
// 基礎版
int BF(char *x, int m, char *y, int n) {
int i, j;
for (j = 0; j <= n - m; ++j) {
for (i = 0; i < m && x[i] == y[i + j]; ++i);
if (i >= m) return j; // 找到,返回起始位置
}
return -1; // 未找到
}
// 優化版:利用 memcmp
#define EOS '\0'
int BF_opt(char *x, int m, char *y, int n) {
char *yb = y;
for (; *y != EOS; ++y)
if (memcmp(x, y, m) == 0)
return y - yb;
return -1;
}
文本:GCATCGCAGAGAGTATACAGTACG
模式:GCAGAGAG
共 17 次嘗試,第 6 次成功匹配(位置 5,0-based)。
| 情況 | 時間複雜度 | 備註 |
|---|---|---|
| 最好 | O(n) | 首字元即不匹配,快速跳過 |
| 最壞 | O(mn) | 如文本 AAAAA...,模式 AAAAB |
| 平均 | O(n) | 隨機字串下期望線性 |