串及BF朴素查找算法(学习整理):

news2024/9/29 13:42:58

关于串的相关定义:

  1. 串:用‘ ’表示的字符序列
  2. 空串:包含零个字符的串
  3. 子串:包含传本身和空串的子串
    1. eg: 'abc'
    2. ('','a','b','c','ab','bc','ac','abc)
    3. 共7个:串的长度的阶乘+1(空串)
  4. 真子串:不包含自身的所有字串
    1. eg: 'abc'
    2. ('','a','b','c','ab','ac','bc')
    3. 共6个:串的长度的阶乘
  5. 空格串:一个或多个空格组成的串

串与字符串的比较:

串:

字符串:

‘ ’ 单引号表示

"" 双引号表示

字符后直接‘ 结尾

字符串结尾默认“\0”

串的长度为字符数

字符串长度为字符数+1(“\0”)

空串: ‘’

空字符串: ”“

BF(朴素查找算法):

问题描述:

在主串str1 中查找子串str2 的位置,若主串中包含字串则返回主串中位置,否则返回-1;

查找引例:
  1. 主串:"ababcabcdabcde 子串:"abcd"
  2. 主串:"aaaaab" 子串:"aaaab"

思路引入:

在例1:主串依次遍历字串,当遇到与字串不匹配时,主串指针直接向后遍历,子串从头便利

例2:主串若如例1思路,主串指针不向后倒退,直接向后遍历则无法得到正确查找答案

BF算法思想:

从主串的pos 位置与字串的字符进行比较,相等时两个串的指针皆向后移动;

不等时:主串倒退到此次开始遍历子串的位置的下一位置,子串指针回到开头,重新开始比较;

具体实现:

int main()
{
	const char *str1 = "ababcabcdabcdeabcdabcdd";
    //主串
	//const char* str1 = "abcd";
	const char* str2 = "abcd";
    //子串
	int j =0;//pos位置
	while(j!=-1)
	{
		 j = BF(str1, str2, j);
		printf("返回类比pos位置:%d\n", j);
		if (j == -1)
			break;
		j += strlen(str2);
	}
	return 0;
}

int BF(const char* str1, const char* str2, int pos)
{
	assert(str1 != NULL && str2 != NULL);
	int len1 = strlen(str1);
	int len2 = strlen(str2);
	if (pos < 0||pos>=strlen(str1)||str1==NULL||str2==NULL)
		return -1;

	int i ; int j = 0;
	i = pos;
	while(i<len1&&j<len2)
	{
			if (str1[i] == str2[j])
			{
				i++;
				j++;
			}
			else
			{
				i = i - j+1;
				j = 0;
			}	
	}
	if (j == len2)
		return i - j;
	return -1;
}
函数功能:
  1. 判断参数是否有效;
  2. 计算两个字符串的长度(strlen()函数计算不包含"\0"的长度);
  3. 分别用 "i" "j" 代表两个字符串的指针下标
  4. 相等:++,向后遍历
  5. 不等: i 回到开始位置的下一位置,j 回到开头
  6. 当子串匹配且遍历完即代表查找成功

代码提示:

  • 字符串比较只能用”strcmp()"函数,同时单个字符无法使用该函数比较,等号比较即可;
//判断相等:
//error:
strcmp(str1[i],str2[j])==0;

//right:
str1[i]==str2[j];
  • %s :只能输出字符串,不能输出字符 eg:不能!str[i]
  • %c:输出单个字符,无法输出字符串 eg:可以 str[i]

由结果输出可知:

该串从零号下标开始,第5,9,14,18位置均找到了子串

算法重点:
  1. 主串指针回退到开始遍历的下一位置
  2. 子串回退到开头
  3. 当子串遍历成功即代表查找成功

BF算法时间复杂度:

主串长度m,子串长度n;

最差情况:若主串中不包含子串时

主串遍历了最多(n)遍子串(m)

由此可得:O(m*n)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1485331.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux安装matlab获取许可证

1.点击许可证 2. 3. 4. 4.主机ID 打开linux输入 /sbin/ifconfigether后边的就是 6.计算机登录名 打开linux输入 whoami7. 8. 9.

【已亲测有效】如何彻底删除nodejs,避免影响安装新版本

第一步开始菜单搜索uninstall node.js&#xff0c;点击之后等待删除&#xff08;删除node_modules文件夹以及以下这些文件&#xff09; 第二步手动删除nodejs下载位置的其他文件夹。&#xff08;就是另外自己新建的两个文件夹node_cache和node_global&#xff09; 到这里其实应…

LDR6328芯片:智能家居时代的小家电充电革新者

在当今的智能家居时代&#xff0c;小家电的供电方式正变得越来越智能化和高效化。 利用PD&#xff08;Power Delivery&#xff09;芯片进行诱骗取电&#xff0c;为后端小家电提供稳定电压的技术&#xff0c;正逐渐成为行业的新宠。在这一领域&#xff0c;LDR6328芯片以其出色的…

什么是VR数字文化遗产保护|元宇宙文旅

VR数字文化遗产保护是指利用虚拟现实&#xff08;VR&#xff09;技术来保护和传承文化遗产。在数字化时代&#xff0c;许多珍贵的文化遗产面临着自然衰退、人为破坏或其他因素造成的威胁。通过应用VR技术&#xff0c;可以以全新的方式记录、保存和展示文化遗产&#xff0c;从而…

C语言指针(4):函数在指针中的进阶应用

1、回调函数 回调函数就是⼀个通过函数指针调⽤的函数。函数参数的形式为函数指针类型。 当你把函数/函数的地址作为参数传递给相应函数是&#xff0c;如果这个指针被用来调用其所指向的函数时&#xff0c;被调用的函数就是回调函数。回调函数不是由该函数的实现方直接调用的&…

workstation 用途

一 workstation 用途 强大的桌面虚拟化 允许创造多种操作系统可以不用重启就跨不同操作系统进行操作可以提供隔离的安全环境 连接到vsphere 可以远程登陆服务器管理物理主机和虚拟主机任何时间都可登陆提高虚拟机效率 为任何平台开发和测试 1&#xff09;借助一台单一本地…

【AI Agent系列】【MetaGPT多智能体学习】6. 多智能体实战 - 基于MetaGPT实现游戏【你说我猜】(附完整代码)

本系列文章跟随《MetaGPT多智能体课程》&#xff08;https://github.com/datawhalechina/hugging-multi-agent&#xff09;&#xff0c;深入理解并实践多智能体系统的开发。 本文为该课程的第四章&#xff08;多智能体开发&#xff09;的第四篇笔记。今天我们来完成第四章的作…

【解决】虚幻导入FBX模型不是一个整体

问题&#xff1a; 现在有一个汽车的fbx模型&#xff0c;导入虚幻引擎&#xff0c;导入后变成了很多汽车零件模型。 解决&#xff1a; 把“合并网格体”勾选上&#xff0c;解决问题。

蓝桥杯(3.2)

1209. 带分数 import java.io.*;public class Main {static BufferedReader br new BufferedReader(new InputStreamReader(System.in));static PrintWriter pw new PrintWriter(new OutputStreamWriter(System.out));static final int N 10;static int n, cnt;static int[…

装饰器模式:原来一直都在用

装饰器模式是一种结构型设计模式&#xff0c;它允许你动态地给一个对象添加一些额外的职责&#xff0c;而不需要使用子类来扩展功能。装饰器模式通过创建一个包装类来包裹原始类&#xff0c;然后在包装类中提供额外的功能&#xff0c;从而实现功能的动态添加&#xff0c;同时也…

【NR 定位】3GPP NR Positioning 5G定位标准解读(三)

目录 前言 5 NG-RAN UE定位架构 5.1 架构 5.2 UE定位操作 5.3 NG-RAN定位操作 5.3.1 通用NG-RAN定位操作 5.3.2 OTDOA定位支持 5.3.3 广播辅助信息支持 5.3.4 NR RAT相关定位支持 5.4 NG-RAN中与UE定位相关的元素功能描述 5.4.1 用户设备&#xff08;UE&#xff09; …

Mybatis Plus框架 基本语法

MybatisPlus 中文官网 依赖配置 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://mav…

3.2日-线性模型,基础优化方法,线性回归从零开始实现

3.2日-线性模型&#xff0c;基础优化方法&#xff0c;线性回归从零开始实现 1线性模型衡量预估质量训练数据总结2基础优化方法3 线性回归从零开始实现 1线性模型 衡量预估质量 训练数据 总结 2基础优化方法 梯度下降是一种优化算法&#xff0c;常用于机器学习和深度学习中&…

【MATLAB】兔子机器人总系统_动力学模型解读(及simulink中的simscape的各模块介绍)

1、动力学模型 Rectangular Joint 控制平面上&#xff08;x&#xff0c;y轴&#xff09;的移动&#xff0c;去掉以后&#xff0c;机器人在原地翻滚不移动 Rigid Transform 坐标转换&#xff0c;B站视频已收藏 去掉&#xff0c;机体与地面贴合 此处的作用是设定机体的初…

Java多线程实现发布和订阅

目录 简介 步骤 1: 定义消息类 步骤 2: 创建发布者 步骤 3: 创建订阅者 步骤 4: 实现发布-订阅模型 前言-与正文无关 生活远不止眼前的苦劳与奔波&#xff0c;它还充满了无数值得我们去体验和珍惜的美好事物。在这个快节奏的世界中&#xff0c;我们往往容易陷入工作的漩涡…

javaWebssh教师荣誉库管理系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 java ssh在线授课辅导系统是一套完善的web设计系统&#xff08;系统采用ssh框架进行设计开发&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0…

leetcode刷题-110 平衡二叉树的判断(递归实现)

题目描述 解题思路 首先解释一下&#xff0c;为什么会做到这个题目&#xff0c;因为博主在按顺序做题的过程中&#xff0c;碰到了一个不会做的题目&#xff08;递归类型&#xff09;&#xff0c;就想着看看题解&#xff0c;发现了一个大佬的文章&#xff0c;就是专门讲的递归&…

Python推导式大全与实战:精通列表、字典、集合和生成器推导式【第115篇—python:推导式】

Python推导式大全与实战&#xff1a;精通列表、字典、集合和生成器推导式 Python语言以其简洁、优雅的语法而闻名&#xff0c;其中推导式是其独特之处之一。推导式是一种在一行代码中构建数据结构的强大方式&#xff0c;它涵盖了列表、字典、集合和生成器。本篇博客将全面介绍…

二维码门楼牌管理系统技术服务:文字规范与技术创新

文章目录 前言一、文字规范&#xff1a;确保信息传达的准确性二、技术创新&#xff1a;推动二维码门楼牌管理系统的升级发展 前言 在数字化时代的浪潮下&#xff0c;二维码门楼牌管理系统作为一种创新的城市管理手段&#xff0c;逐渐进入大众视野。这套系统不仅优化了城市空间…

131. 分割回文串(力扣LeetCode)

文章目录 131. 分割回文串题目描述回溯代码 131. 分割回文串 题目描述 给你一个字符串 s&#xff0c;请你将 s 分割成一些子串&#xff0c;使每个子串都是 回文串 。返回 s 所有可能的分割方案。 回文串 是正着读和反着读都一样的字符串。 示例 1&#xff1a; 输入&#xf…