当前位置: 首页 > news >正文

数据结构(BF算法 )

//BF算法 枚举的思想 逻辑 BF O(n*m KMP O(nm)//1 申请俩个指针i和j 分别指向主串和子串的开始位置//2 进入while循环 循环的条件是i和j还合法//3 比较i和j指向的字符如果相同 则让i和j同步向后一个位置//4 如果不相同 则让指向子串的j变量 回退到开始位置 让指向主串的i变量也需要回退 回退到这一趟失败匹配的下一个字符//5 如果while循环进不去 则说明代码结束了 只需要对j进行判断#includestdio.h#includeassert.h#include stdlib.h#include string.h#include errno.hint BF_Search(const char* MainStr, const char* SubStr){assert(MainStr ! NULL SubStr ! NULL);int i 0;int j 0;int mainlen strlen(MainStr);int SubStrlen strlen(SubStr);while (i mainlen j SubStrlen){if (MainStr[i] SubStr[j]){i;j;}else{i i - j 1;j 0;}}if (j SubStrlen){return -1;}return i - j;}//KMP的核心 i打死不回退// 最长公共前后缀 再一个字符串里 找到俩个真子串 且一个顶头开始 另一个顶尾结束 且一模一样 长度还最长//场景一 当发生失配现象时 对应j指向的子串的位置 向前看可以找到最长公共前后缀、//总结 已知条件//1 当发生失配现象时 i已经走过的主串的路程 和j已经走过的子串的路程是一模一样的//2 从上红和下红中截取同一段路程 则也一定相同// 我们给的条件//1 当发生失配现象时 j指向的子串位置向前看 可以找到最长公共前后缀//推论 因为下蓝和右绿是同一个东西 可以有左绿上蓝//既然能证明存在左绿上蓝 则当发生失配现象时 i要么回退的位置没意义 则不用回退//当然如果i回退的位置的字符和j指向的子串0下标字符匹配成功 则回退有意义 但是i和j接下来要走的路径是左绿和上蓝 是100%成功的//则默认已经走过了//换句话说 i要么回退没意义 要么回退有意义 但是可以通过让j不用无脑回退到0 而是让j回退到一个合适的位置 从而把i回退到有意义位置抵消掉//场景二 当发生失配现象时 对应j指向的子串的位置 向前看不可以找到最长公共前后缀//总结 已知条件//1 当发生失配现象时 i已经走过的主串的路程 和j已经走过的子串的路程是一模一样的//2 从上红和下红中截取同一段路程 则也一定相同// 我们给的条件//1 当发生失配现象时 j指向的子串位置向前看 不可以找到最长公共前后缀//推论 因为下蓝和右绿是同一个东西 可以有左绿上蓝//因为下蓝和右绿是同一个东西 可以有左绿上蓝//场景2 i可以不用回退 要么i回退的位置没意义 要么i回退的位置有意义 但是因为不存在左绿上蓝 所有i回退之后一开始//好像比较成功 但是i接着向后走 再次走到原本失配的位置过程中 一定会有一个位置和j指向的字符匹配失败//因为j指向的子串可以在任何位置发生失配现象 则子串的任意一个位置都应该有一个合适的回退下标//则可以用一个数组来存储字串的全部回退位置信息 这个数组就是next数组// KMP算法应用// A B A B C A B C D A B C D E//-1 0 0 1 2 0 1 2 0 0 1 2 0 0// 0 1 1 2 3 1 2 3 1 1 2 3 1 1// A A A A A A A A A A B//-1 0 1 2 3 4 5 6 7 8 9// 0 1 2 3 4 5 6 7 8 9 10// A B C D A B C//-1 0 0 0 0 1 2// 0 1 1 1 1 2 3// A A B A A B A A//-1 0 0 0 1 2 3 1// 1 1 1 1 2 3 4 2// A B B B A B B B A C//-1 0 0 0 0 1 2 3 4 5// 0 1 1 1 1 2 3 4 5 6
http://www.rkmt.cn/news/1374701.html

相关文章:

  • 2026年工作任务可视化工具推荐:7款软件适用场景分析
  • Go二进制逆向实战:IDA精准定位main.main与runtime函数
  • Java NIO 连接状态守卫:AlreadyConnectedException 源码深度剖析与 SocketChannel 生命周期契约
  • 保姆级教程:在ESXi 6.7安装前,搞定BIOS里的VT-x、VT-d和AES-NI设置
  • WABT实战指南:用wasm-decompile精准逆向WebAssembly
  • Linux网络编程基础(地址结构)
  • 中兴光猫工厂模式终极解锁:3分钟掌握免费高效管理工具
  • Ventoy安装后U盘识别不了?手把手教你从下载(附国内镜像站)到成功引导Win10的完整避坑指南
  • 机器学习加速超导材料发现:从梯度提升回归到DFT验证的完整工作流
  • 船舶油耗预测模型评估:从R²、RMSE到特征工程与调优实战
  • 【好靶场】文件上传漏洞(上传HTML弹XSS)
  • jave相对来说这样哒啊
  • 保姆级教程:Ubuntu 20.04下RTL8111/8168网卡驱动安装与自动加载(实测有效)
  • AssetStudio深度指南:Unity资源提取与二进制结构解析
  • 基于神经网络的星际冰成分分析:AICE工具的设计原理与应用实践
  • MACE机器学习势下非平衡分子动力学的应力与热流精确计算
  • BL51链接器.map文件解析与嵌入式内存优化
  • JMeter登录注册接口压测实战:CSRF处理、Token管理与数据幂等性
  • 国内半导体展推荐,国内半导体展中小企业参展攻略 - 品牌2025
  • r0capture安卓抓包原理:绕过证书固定提取SSL密钥
  • UABEA:Unity跨平台资源编辑与二进制解析工具深度指南
  • 一场不容错过的行业盛会:2026半导体产业风向标 - 品牌2025
  • Unity Render Streaming移动端适配实战:低延迟、抗弱网、后台不中断
  • Win11+Win7虚拟机HTTPS抓包:证书信任链重建与Wireshark解密实战
  • Arm SME架构矩阵运算指令SUMOP4S与SUVDOT解析
  • JA3指纹校准实战:让Python爬虫通过TLS层反爬
  • 轨迹分析中的“局部”智慧:如何用MDL+密度聚类,在Python里搞定外卖骑手热点路径挖掘?
  • Selenium模拟淘宝滑块验证:行为建模与反检测实战
  • Unity序列化三要素:Serializable、SerializeField与SerializeReference详解
  • Unity与UE5全栈开发:引擎层到部署层的闭环交付能力