BF(Brute-Force)算法
一、问题引入#
模式匹配算法是对两个字符串进行比较匹配的算法。
在两个串中字符逐个匹配,若完全匹配,则返回位置,否则返回-1。
二、解决过程#
2-1 函数:index_bf()#
int index_bf(char *S, char *T, int pos)
{
int S_len = strlen(S);
int T_len = strlen(T);
if (S_len == 0 || T_len == 0)
return -1;
if (pos < 0 || pos > S_len-1)
return -1;
int i = pos, j = 0;
while (i < S_len && j < T_len)
{
if (S[i] == T[j])
{
++i;
++j;
}
else
{
i = i - j + 1; // i 移到最近一次相等的位置
j = 0; // j 移到起点位置
}
}
if(j >= T_len) // 若字符串S和T全部比较完后,且j的位置移到T的末尾,则匹配成功
return (i - T_len);
else
return -1;
}
2-2 函数:main()#
#include <stdio.h>
int main(void)
{
char S[] = {"hello world"};
char T[] = {"heo"};
int index; // index从0开始
printf("S_String:%s\n", S);
printf("T_String:%s\n", T);
if (-1 == ( index = index_bf(S, T, 0)))
{
printf("Not found\n");
}
else
{
printf("Found, index is %d\n", index);
}
return 0;
}
💡 运行结果
三、反思总结#
教材:数据结构第二版 的pos范围是1<=pos<=S_len,但字符串的下标是从0开始的。故对pos有效范围进行调整0<=pos<=S_len-1
匹配过程中,若S[i] == T[j],则同时移动到下一个位置(即 ++i 和 ++j)。否则i移到上一次相等匹配的位置(即 i-j+1),j移到初始位置0
设主串的长度为n,字串的长度为m。
1)最好情况:平均时间复杂度是 O(n+m)
例如:
S = "aaaaaba"
T = "ba"
2)最坏情况:平均时间复杂度是 O(n*m)
例如:
S = "aaaaaab"
T = "aab"
四、参考引用#
数据结构第二版:C语言版 【严蔚敏】
作者:caojun97
出处:https://www.cnblogs.com/caojun97/p/17285314.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix