//
// 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;
}