
日升时奋斗,日落时自省
目录
一、BF暴力算法
暴力算法是普通的模式匹配算法
针对一个主串和一个子串,子串是否能跟主串的某一段进行完全匹配,直白点就是子串在主串中出现。(并且返回子串第一次出现的下标位置)
BF思想:就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和T的第二个字符再进行比较,依次下去,如果不相等的话,S需要退回,退回多少?当前T字符串位置-1(后面通过例题来解释当前现象)
例题演示:给出字符串 ”ababcabcdabcde”作为主串, 然后给出子串: ”abcd”,现在我们需要查找子串是否在主串中出现,出现返回主串中的第一个匹配的下标,失败返回-1 ;
下面给出图解:

这里附一下代码:
//暴力算法
public static int BF(String str,String sub){
if(str==null||sub==null){ //稍微谨慎一点 如果字符串任意一个为空的话就不用找了, 直接返回
return -1;
}
int strlen=str.length();
int sublen=sub.length();
if(strlen==0||sublen==0){ //字符串虽然存在但是没有字符存在 也就找不到 直接返回
return -1;
}
int i=0;
int j=0;
//首先就是整体遍历
while(i<strlen&&j<sublen){
//如果两个相等的话 就可以直接走了
//如果两个主串和子串的字符相等的话 主串 和 子串都进行++ ,进行两个字符串的下一个字符比较
if(str.charAt(i)==sub.charAt(j)){
i++;
j++;
}else{
//如果不等呢 那子串就从0开始,重新和主串比较
//主串回退 :那前面有一段肯定是跟子串一模一样的 ,所以主串当前下标位置减去 子串当前位置下标回到了原来字符串相等的位置,但是还需要在该位置加一 进行下一次新的比较开始
i=i-j+1;
j=0;
}
}
//只有子串走完了才算是找到 所以大于或者等于都在其内
if(j>=sublen){
return i-j; //为什么是 i-j 因为返回当前已经找到的子串的第一个下标 用当前下标减去子串长度
}
//没有找到的话 ,就是子串没有走完呗
return -1;
}
public static void main(String[] args) {
System.out.println(BF("ababcabcdabcde", "abcd"));
}
这里有一个位置理解可能有点困难,结合案例 自己画画图,理解比较快捷
代码配有注释:
这里再次解释一下 ,该段代码
while(i<strlen&&j<

本文探讨了暴力匹配算法BF与KMP算法的对比,重点讲解了KMP算法中的next数组优化,如何通过构建next数组减少回退次数,以降低字符串匹配的时间复杂度。通过实例和代码解析,揭示了KMP算法在主串搜索子串时的高效策略。
最低0.47元/天 解锁文章
3148

被折叠的 条评论
为什么被折叠?



