博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

模式匹配暴力算法 - BF 算法

Posted on 2025-04-20 09:50  steve.z  阅读(61)  评论(0)    收藏  举报
//
//  main.c
//  09_String
//
//  Created by steve xiaohu zhao on 2025/4/20.
//

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

/// 暴力匹配算法(Brute Force)——方式一
/// 在主串 text 中查找子串 pattern 的首次出现位置
/// 若找到,返回其起始下标;否则返回 -1
int BF(char *text, char *pattern) {
    // 检查输入指针是否为空
    if (text == NULL || pattern == NULL) {
        return -1;
    }
    int N = (int)strlen(text);    // 主串长度
    int M = (int)strlen(pattern); // 模式串长度

    // 如果任一串为空或模式串比主串还长,直接返回 -1
    if (N == 0 || M == 0 || N < M) {
        return -1;
    }

    // 枚举主串中所有可能的匹配起点
    for (int i = 0; i <= N - M; i++) {
        int j;
        // 从当前起点逐字符比较 pattern 和 text
        for (j = 0; j < M; j++) {
            if (text[i + j] != pattern[j]) {
                break; // 若有任意字符不匹配,则退出内层循环
            }
        }
        // 如果成功匹配完整个 pattern,则返回起始位置 i
        if (j == M) {
            return i;
        }
    }
    // 若遍历完仍无匹配,返回 -1
    return -1;
}

/// 暴力匹配算法(Brute Force)——方式二(使用指针回退优化)
/// 原理:主串指针 i 向前走,模式串 j 跟着走;一旦匹配失败,i
/// 回退到上次尝试起点的下一个字符,j 重置为 0
int BF1(char *text, char *pattern) {
    // 判空
    if (text == NULL || pattern == NULL) {
        return -1;
    }
    int N = (int)strlen(text);    // 主串长度
    int M = (int)strlen(pattern); // 模式串长度

    if (N == 0 || M == 0 || N < M) {
        return -1;
    }

    int i = 0, j = 0; // i 遍历 text,j 遍历 pattern
    while (i < N && j < M) {
        if (text[i] == pattern[j]) {
            // 当前字符匹配,继续比较下一个字符
            ++i;
            ++j;
        } else {
            // 匹配失败,i 回到上次尝试起点的下一个字符,j 重置为 0
            i = i - j + 1;
            j = 0;
        }
    }

    // 如果 j == M,说明成功匹配了整个 pattern,返回起始下标;否则返回 -1
    return (j == M) ? (i - j) : -1;
}

int main(int argc, const char *argv[]) {
    char *text = "hello tiger~"; // 主串
    char *pattern = "tiger";     // 模式串
    int r = BF1(text, pattern);  // 使用 BF1 进行查找
    printf("index = %d\n", r);   // 输出匹配位置
    return 0;
}