C语言——字符串匹配法(BF算法)

这篇博客介绍了C语言中实现BF(Brute Force,朴素)算法进行字符串匹配的方法,详细阐述了算法原理,并提供了相应的源代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

BF算法(朴素算法):

说明如下如所示:
在这里插入图片描述
实现效果如图:
在这里插入图片描述


在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

源码如下:

#include<stdio.h>
#include<stdlib.h>
//结构体 
typedef struct String
{
   
	char* data;//字符串 
	int len;//长度 
}String;
//初始化字符串链表 
String* initString()
{
   
	String* s=(String*)malloc(sizeof(String));
	s->data=NULL;
	s->len=0;
	return s;
}
//分配字符串
### C语言字符串模式匹配算法实现 以下是两种常见的字符串模式匹配算法——BF(Brute Force)算法和KMP(Knuth-Morris-Pratt)算法的C语言实现。 #### BF算法实现 BF算法是最基础的字符串匹配,通过逐一比较主串与子串中的字符来完成匹配过程。如果当前字符不匹配,则移动到下一个可能的位置重新开始比较。 ```c #include <stdio.h> #include <string.h> // 定义简单字符串结构体 typedef struct { char val[100]; int length; } SString; // 暴力匹配算法 int force_search(SString S, SString T) { int i = 1, j = 1; // 初始化索引变量 while (i <= S.length && j <= T.length) { // 遍历主串和子串 if (S.val[i] == T.val[j]) { // 如果当前字符匹配 ++i; // 继续向后遍历 ++j; } else { // 否则重置指针 i = i - j + 2; // 主串回溯至下一位置 j = 1; // 子串回到起点 } } if (j > T.length) { // 若完全匹配返回起始位置 return i - T.length; } else { // 不匹配返回0 return 0; } } void main() { SString S, T; printf("请输入主串: "); scanf("%s", S.val); S.length = strlen(S.val); printf("请输入子串: "); scanf("%s", T.val); T.length = strlen(T.val); int pos = force_search(S, T); // 调用暴力匹配函数 if (pos != 0) { printf("子串在主串中的起始位置为:%d\n", pos); } else { printf("未找到匹配子串。\n"); } } ``` 此代码实现了简单的暴力匹配逻辑[^2]。 --- #### KMP算法实现 KMP算法的核心在于构建`next[]`数组,该数组记录了模式串的部匹配信息,从而避免不必要的重复比较。这使得KMP的时间复杂度降低为线性级别 \( O(m+n) \)[^3]。 ```c #include <stdio.h> #include <string.h> // 计算 next 数组 void get_next(char *T, int *next) { int i = 0, k = -1; next[0] = -1; // 初始状态设置 while (i < strlen(T) - 1) { if (k == -1 || T[i] == T[k]) { ++i; ++k; next[i] = k; // 更新部匹配值 } else { k = next[k]; // 回退寻找更长前缀 } } } // KMP 匹配算法 int kmp_search(char *S, char *T, int *next) { int i = 0, j = 0; while (i < strlen(S) && j < strlen(T)) { if (j == -1 || S[i] == T[j]) { ++i; ++j; } else { j = next[j]; // 使用 next 数组跳过不可能匹配的情况 } } if (j >= strlen(T)) { return i - strlen(T); // 返回匹配起始位置 } else { return -1; // 表示无匹配 } } void main() { char S[100], T[50]; int next[50]; printf("请输入主串: "); scanf("%s", S); printf("请输入子串: "); scanf("%s", T); get_next(T, next); // 构造 next 数组 int pos = kmp_search(S, T, next); // 执行 KMP 匹配 if (pos != -1) { printf("子串在主串中的起始位置为:%d\n", pos); } else { printf("未找到匹配子串。\n"); } } ``` 以上代码展示了如何使用`get_next()`函数计算`next[]`数组以及调用`kmp_search()`执行高效匹配[^3]。 --- ### 总结 上述两段代码别演示了BF算法和KMP算法的具体实现方式。其中,BF算法虽然易于理解但效率较低;而KMP算法通过对模式串预处理优化了整体性能,在实际应用中更为推荐。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值