「这是我参与2022首次更文挑战的第18天,活动详情查看:2022首次更文挑战」。
BF算法
BF算法,即暴力(Brute Force)算法,是普通的模式匹配算法。
模式匹配
模式匹配:在主串 T 中寻找子串 P 的过程,P也称为模式
如果匹配成功,返回 P 在 T 中的位置;否则返回 0
模式匹配问题有什么特点?
- 算法的一次执行时间:问题规模通常很大,常常在大量信息中进行匹配
- 算法改进所取得的积累效益:模式匹配操作经常被调用,执行频率高
算法的基本思想
- 在串 T 和串 P 中设比较的起始下标 i 和 j;
- 循环直到 T 或 P 的所有字符均比较完,如果T[i] 等于P[j],继续比较 T 和 P 的下一个字符;否则,将 i 和 j 回溯,准备下一趟比较;
- 如果P中所有字符均比较完,则返回匹配的起始比较下标;否则返回 0;
算法的运行实例
例:主串 T = "ababcabcacbab",模式 P ="abcac"
i=2,j=2失败;i 回溯到 1,j 回溯到 0
i=2,j=2失败;i 回溯到 1,j 回溯到 0
i=1,j=0失败,i 回溯到 2,j 回溯到 0
i=6,j=4失败,i 回溯到 3,j 回溯到 0
i=3,j=0失败,i 回溯到 4,j 回溯到 0
i=4,j=0失败,i 回溯到 5,j 回溯到 0
i=10,j=5,T中全部字符都比较完毕,匹配成功
代码
int Index(SString T,SString P,int pos){
//求从主串T的下标pos起,串P第一次出现的位置,匹配成功返回位置序号,否则返回0
int i,j,start;
//若模式串为空串,则返回-1
if (P.length==0) return -1;
//start记录主串T每趟比较的起始位置
start=pos; i=start; j=0;
while (i<T.length && j<P.length)
//对应字符相等则继续比较下一个
if (T.ch[i]==P.ch[j]) {i++;j++;}
else{
//对于字符不相等,i回溯,j归0
start++; i=start; j=0;
}
if (j>=P.length)
//匹配成功返回匹配的起始位置
return start+1;
//匹配失败返回0
else return 0;
}