BF算法(字符串查找)

简介: BF算法(字符串查找)

前言 字符串的匹配算法也是很经典的一个算法,在面试,刷题的时候常常会遇到,而BF算法是字符串模式匹配中的一个简单的算法。

BF(Brute Force)算法和它的名字一样,就是粗暴!是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T的第二个字符;若不相等,则比较S的第二个字符和T的第一个字符,依次比较下去,直到得出最后的匹配结果。没有什么技巧性,就是一个个进行比较得出最后的结论,这个方法也是最通俗易懂的,后面一篇我有写KMP算法是对BF算法的极大优化包括对next数组的优化。学完这个BF算法看看你是否对KMP算法感兴趣,如果有兴趣可以学习下我的下一篇KMP算法

优势:易懂

劣势:复杂度高,效率低,时间复杂度为O(m*n);

BF方法: 现在给你两个字符串母串“abcdabcdef”,子串“def”你会怎么去查找子串位于母串的位置呢?BF算法是同时遍历母串和子串的每一个字符如果相同两个字符串都向后移动,如果不同将母串返回到最开始遍历的下一个元素上,子串返回0位置重新遍历,直到子串的字符在母串中全部找到对应位置。

我用i表示对母串的遍历,j表示对子串的遍历。

下面我给大家画了个图

匹配失败

每次失败母串返回到最开始遍历的下一个元素位置上(i=i-j+1),子串返回0位置重新遍历

image.png

匹配成功

返回母串的d的7下标即可,这里可以用i=i-j表示

image.png

public class bf { public static int BF(String str,String sub,int pos) { int strLength=str.length(); int subLength=sub.length(); if(subLength>strLength-pos) { return -1; } int i=pos,j=0; //循环条件是当i对母串的遍历以及j对子串的遍历不越界 while(i<strLength && j<subLength) { //单个字符匹配成功 if(str.charAt(i)==sub.charAt(j)) { i++; j++; //失败情况 } else { //母串返回开始匹配的下一个位置上,子串返回0位置 i=i-j+1; j=0; }
    }
    //这里只有子串被遍历完才能说明他被母串包含了,并且返回对应的下标
    if(subLength==j) {
        return i-j;
    }
    return -1;
}
public static void main(String[] args) {
    //这里是我对BF算法的测试
    String str="asdffre";
    String sub="ffr";
    int place=BF(str,sub,0);
    System.out.println(place);
}

} BF算法是比较无脑的,这里聪明的你肯定了解了BF算法了,下面如果还想学习优化的KMP算法以及next数组的优化对KMP的进一步优化请学习我下一篇博客!!!

目录
打赏
0
0
0
0
1
分享
相关文章
|
8月前
|
【算法】滑动窗口——找到字符串中所有字母异位词
【算法】滑动窗口——找到字符串中所有字母异位词
107 0
|
6月前
|
两个字符串匹配出最长公共子序列算法
本文介绍了最长公共子序列(LCS)问题的算法实现,通过动态规划方法求解两个字符串的最长公共子序列,并提供了具体的编程实现细节和示例。
162 1
两个字符串匹配出最长公共子序列算法
掌握算法学习之字符串经典用法
文章总结了字符串在算法领域的经典用法,特别是通过双指针法来实现字符串的反转操作,并提供了LeetCode上相关题目的Java代码实现,强调了掌握这些技巧对于提升算法思维的重要性。
字符串相似度算法完全指南:编辑、令牌与序列三类算法的全面解析与深入分析
在自然语言处理领域,人们经常需要比较字符串,这些字符串可能是单词、句子、段落甚至是整个文档。如何快速判断两个单词或句子是否相似,或者相似度是好还是差。这类似于我们使用手机打错一个词,但手机会建议正确的词来修正它,那么这种如何判断字符串相似度呢?本文将详细介绍这个问题。
485 1
揭开JavaScript字符串搜索的秘密:indexOf、includes与KMP算法
JavaScript字符串搜索涵盖`indexOf`、`includes`及KMP算法。`indexOf`返回子字符串位置,`includes`检查是否包含子字符串。KMP是高效的搜索算法,尤其适合长模式匹配。示例展示了如何在数据采集(如网页爬虫)中使用这些方法,结合代理IP进行安全搜索。代码示例中,搜索百度新闻结果并检测是否含有特定字符串。学习这些技术能提升编程效率和性能。
217 1
揭开JavaScript字符串搜索的秘密:indexOf、includes与KMP算法
|
8月前
|
惊爆!KPM算法背后的秘密武器:一行代码揭秘字符串最小周期的终极奥义,让你秒变编程界周期大师!
【8月更文挑战第4天】字符串最小周期问题旨在找出字符串中最短重复子串的长度。KPM(实为KMP,Knuth-Morris-Pratt)算法,虽主要用于字符串匹配,但其生成的前缀函数(next数组)也可用于求解最小周期。核心思想是构建LPS数组,记录模式串中每个位置的最长相等前后缀长度。对于长度为n的字符串S,其最小周期T可通过公式ans = n - LPS[n-1]求得。通过分析周期字符串的特性,可证明该方法的有效性。提供的C++示例代码展示了如何计算给定字符串的最小周期,体现了KPM算法在解决此类问题上的高效性。
195 0
C++ bcrypt算法 字符串加密,亲测有效
C++ bcrypt算法 字符串加密,亲测有效
算法训练,牛客.判断是不是平衡二叉树 牛客.最大子矩阵两个数组的交集牛客.数组中两个字符串的最小距离
算法训练,牛客.判断是不是平衡二叉树 牛客.最大子矩阵两个数组的交集牛客.数组中两个字符串的最小距离
算法训练,牛客.判断是不是平衡二叉树 牛客.最大子矩阵两个数组的交集牛客.数组中两个字符串的最小距离
|
11月前
|
KPM算法求字符串的最小周期证明
公式 `ans = n - LPS[n-1]` 描述了最小周期,其中 `n` 是子串长度,`LPS[n-1]` 是前缀函数值。证明分为特殊情况和一般情况:对于完整周期字符串,`LPS[n-1] = 3*T`,故 `ans = T`;对于非完整周期,通过分析不同长度的 `[末部分]` 和 `[前部分]`,展示 `ans` 始终等于周期 `T` 或由 `[e][b]` 构成的最小周期,从而证明公式正确。
110 3
KMP算法详解及其在字符串匹配中的应用
KMP算法详解及其在字符串匹配中的应用
下一篇
oss创建bucket
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等