字符串匹配算法(上)

简介: 字符串匹配算法(上)

1、BF(暴力匹配)算法的定义

BF算法,即暴力(Brute Force)算法,是普通的模式匹配算法,BF算法的思想就是将主字符串S的第一个字符与子串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符;若不相等,则比较S的第二个字符与T的第一个字符,依次比较下去,直到得出最后匹配结果。


2、BF的解题思路

BF算法的定义比较难懂,下面来举个例子:


假设我们给出”abaeaabcda"作为主串,“abcd"作为子串,我们的目标是查找字串是否在主串中出现,若出现,则返回主串的第一个匹配的下标;若未出现,则返回-1.


73ea30ec7efe4554bf58bde05ae76e72.png


最开始i,j都分别对应主串和子串的0下标,如果i和j下标对应的字符相同,则i++,j++


689966d01719418a9bc746316c198115.png


当i和j下标对应字符不同时,i回到之前匹配失败的起始位置加1,即j=j-i+1;j回到最开始,即j=0;


2dfdc4fdb76b4725a36edcf2221c2a09.png


此时i和j下标对应字符不等,i=i-j+1,即i=2;j=0;


830353ad64c2439997d30ce5db79b9bc.png


此时i与j下标对应字符相同,i++,j++


f0fcefe7b9b645ae803d58acb06fc941.png


此时i与j下标对应字符不同,i=i-j+1,即i=3;j=0 以此类推,直到i=5,j=0时,i++,j++…

直到 i=9,j=4



30a037c148c94465aee86f2963d9b3eb.png

子串遍历完成,说明在主串中找到字串,子串在主串第一个字符下标为i-j=5;

若主串先遍历完成,则说明主串没有这个子串。


3、代码实现

// 字符串匹配法 BF

//str:主串

//sub:子串

//返回值:返回子串在主串的下标。如果没有返回-1;


#include <stdio.h>
#include <string.h>**
int BF(char* str, char* sub)
{
  if (str == NULL || sub == NULL)//如果子串或者主串为空,则输出-1
  {
    return -1;
  }
  int lenstr = strlen(str);
  int lensub = strlen(sub);
  int i = 0;
  int j = 0;
  while (i < lenstr && j < lensub)//主串和子串都没有遍历结束
  {
    if (str[i] == sub[j])
    {
      i++;
      j++;
    }
    else
    {
      i = i - j + 1;
      j = 0;
    }
  }
  if (j >= lensub)//子串遍历完成,返回主串字符对应下标值
  {
    return i-j;
  }
  else//若子串未遍历完成,则是主串遍历完成,表示在主串中未找到子串
  {
    return -1;
  }
}
int main()
{
  printf("%d\n", BF("abaeaabcda","abcd"));
  printf("%d\n", BF("aeceaabada", "abcd"));
  return 0;
}

输出结果为:

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