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

关于串的相关定义:

  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)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java进阶-IO(3)

话接上回&#xff0c;继续java IO的学习。上一次说完了字符流的读写数据&#xff0c;这次将基础部分剩余的一点内容看完。 一、流按功能分类 1、系统流 1.1 概述 系统流的类为 java.lang.System。Sytem 类封装了 Java 程序运行时的 3 个系统流。 System.in&#xff1a;标…

腾讯云幻兽帕鲁服务器中,如何检查并确保所有必要的配置文件(如PalWorldSettings.ini和WorldOption.sav)正确配置?

腾讯云幻兽帕鲁服务器中&#xff0c;如何检查并确保所有必要的配置文件&#xff08;如PalWorldSettings.ini和WorldOption.sav&#xff09;正确配置&#xff1f; 登录腾讯云控制台&#xff1a;登录轻量云控制台&#xff0c;找到部署了幻兽帕鲁的服务器&#xff0c;单击实例卡片…

基于BP-Adaboost的预测与分类,附MATLAB代码免费获取

今天为大家带来一期基于BP-Adaboost的预测与分类。代码中的BP可以替换为任意的机器学习算法。 原理详解 BP-AdaBoos模型先通过 AdaBoost集成算法串行训练多个基学习器并计算每个基学习 器的权重系数,接着将各个基学习器的预测结果进行线性组合,生成最终的预测结果。关于更多的原…

关于编写测试用例的一些思考

测试用例是QA同学的基本功&#xff0c;每个人都有一套编写测试用例的体系&#xff0c;本文是作者结合自身的工作经验以及阅读一些测试相关的书籍后的一些看法&#xff0c;欢迎大家一起讨论学习。 测试设计 测试用例格式 面试中一些常见的问题 1.APP测试与服务端测试的区别&am…

计算机设计大赛 深度学习火车票识别系统

文章目录 0 前言1 课题意义课题难点&#xff1a; 2 实现方法2.1 图像预处理2.2 字符分割2.3 字符识别部分实现代码 3 实现效果4 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 图像识别 火车票识别系统 该项目较为新颖&#xff0c;适…

StarRocks实战——首汽约车实时数仓实践

目录 前言 一、引入背景 二、OLAP引擎选型 三、架构演进 四、实时数仓构建 五、业务实践价值未来规划 原文大佬的这篇首汽约车实时数仓实践有借鉴意义&#xff0c;这里摘抄下来用作学习和知识沉淀。 前言 首汽约车&#xff08;以下简称“首约”&#xff09;是首汽集团打造…

滑动窗口问题

日升时奋斗&#xff0c;日落时自省 目录 一、长度最小的子数组 二、无重复字符的最长子串 三、最大连续1的个数III 四、将x减到0的最小操作数 五、水果成篮 六、找到字符串中所有字母异位词 七、串联所有单词的⼦串 八、最小覆盖子串 注&#xff1a;滑动窗口其实很类似…

图片按照宽度进行居中裁剪,缩放大小

要求 文件存放在img_folder_path中 裁剪要求&#xff1a; 图片大小以高度为基准。居中裁剪 缩放要求&#xff1a; 图片缩放到512大小 图片另存到save_file_path路径中 代码 import numpy as np import cv2 import os from tqdm import tqdm#原图片存放位置 img_folder_p…

操作系统原理与实验——实验三优先级进程调度

实验指南 运行环境&#xff1a; Dev c 算法思想&#xff1a; 本实验是模拟进程调度中的优先级算法&#xff0c;在先来先服务算法的基础上&#xff0c;只需对就绪队列到达时间进行一次排序。第一个到达的进程首先进入CPU&#xff0c;将其从就绪队列中出队后。若此后队首的进程的…

Spring重点记录

文章目录 1.Spring的组成2.Spring优点3.IOC理论推导4.IOC本质5.IOC实现&#xff1a;xml或者注解或者自动装配&#xff08;零配置&#xff09;。6.hellospring6.1beans.xml的结构为&#xff1a;6.2.Spring容器6.3对象的创建和控制反转 7.IOC创建对象方式7.1以有参构造的方式创建…

【硬件相关】RDMA网络类别及基础介绍

文章目录 一、前言1、RDMA网络协议2、TCP/IP网络协议 二、RDMA类别1、IB2、RoCE3、iWARP 三、RDMA对比1、优缺点说明a、性能b、扩展性c、维护难度 2、总结说明 一、前言 roce-vs-infiniband-vs-tcp-ip RoCE、IB和TCP等网络的基本知识及差异对比 分布式存储常见网络协议有TCP/IP…

【【C语言简单小题学习-1】】

实现九九乘法表 // 输出乘法口诀表 int main() {int i 0;int j 0;for (i 1; i < 9; i){for (j 1; j < i;j)printf("%d*%d%d ", i , j, i*j);printf("\n"); }return 0; }猜数字的游戏设计 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdi…

c语言--qsort函数(详解)

目录 一、定义二、用qsort函数排序整型数据三、用qsort排序结构数据四、qsort函数的模拟实现 一、定义 二、用qsort函数排序整型数据 #include<stdio.h> scanf_S(int *arr,int sz) {for (int i 0; i < sz; i){scanf("%d", &arr[i]);} } int int_cmp(c…

点云数据结构化与体素化理论学习

一、PCD点云数据存储格式的进一步认识 &#xff08;一&#xff09;PCD点云存储格式相较于其它存储格式&#xff08;如PLY、STL、OBJ、X3D等&#xff09;的优势[1] &#xff08;1&#xff09;具有存储和处理有组织的点云数据集的能力&#xff0c;这对于实时应用和增强现实及机器…

GEE入门篇|图像处理(三):阈值处理、掩膜和重新映射图像

阈值处理、掩膜和重新映射图像 本章前一节讨论了如何使用波段运算来操作图像&#xff0c; 这些方法通过组合图像内的波段来创建新的连续值。 本期内容使用逻辑运算符对波段或索引值进行分类&#xff0c;以创建分类图像。 1.实现阈值 实现阈值使用数字&#xff08;阈值&#xf…

YOLOv9独家原创改进|增加SPD-Conv无卷积步长或池化:用于低分辨率图像和小物体的新 CNN 模块

专栏介绍&#xff1a;YOLOv9改进系列 | 包含深度学习最新创新&#xff0c;主力高效涨点&#xff01;&#xff01;&#xff01; 一、文章摘要 卷积神经网络(CNNs)在计算即使觉任务中如图像分类和目标检测等取得了显著的成功。然而&#xff0c;当图像分辨率较低或物体较小时&…

电源通常向计算机内部的各种组件提供的三种电压:1

本文将与您分享电源通常为计算机内部各个组件提供的三种电压是什么。 小编觉得还是比较实用的&#xff0c;所以分享给大家&#xff0c;作为参考。 下面就跟随小编一起来看看吧。 电源通常为电脑内部的各个部件提供三种电压&#xff1a; 1&#xff0e; 5V&#xff0c;主要供给主…

【k8s管理--两种方式安装prometheus】

1、k8s的监控方案 1.1 Heapster Heapster是容器集群监控和性能分忻工具&#xff0c;天然的支持Kubernetes和CoreOS。 Kubernetes有个出名的监控agent–cAdvisor。在每个kubernetes Node上都会运行cAdvisor&#xff0c;它会收集本机以及容器的监控数(cpu,memory,filesystem,ne…

Matlab 机器人工具箱 RobotArm类

文章目录 1 RobotArm1.1 方法1.2 注意2 RobotArm.RobotArm3 RobotArm.cmove4 其他官网:Robotics Toolbox - Peter Corke 1 RobotArm 串联机械臂类 1.1 方法 方法描述plot显示机器人的图形表示teach驱动物理和图形机器人mirror使用机器人作为从机来驱动图形</

C++ 设计模式

文章目录 类图泛化实现关联聚合组合依赖总结 类内部的三种权限&#xff08;公有、保护、私有&#xff09;类的三种继承方式描述与图总结 面向对象七大原则单一职责原则&#xff08;Single Responsibility Principle&#xff09;里氏替换原则&#xff08;Liskov Substitution Pr…