首页 > 编程语言 >字符串与BF算法

字符串与BF算法

时间:2024-03-22 20:33:15浏览次数:28  
标签:BF sub int pos 算法 str 字符串

1.定义:

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

2.BF算法思想

相等则继续比较,不相等即查找失败则回退,回退是i(主串的下标),退回到刚才的位置的下一个,j推到0

//成功返回字符串在主串中的下标,失败返回-1

pos:开始查找的主串下标;

3.BF算法的实现




//在主串str的pos位置查找子串sub,找到返回下标,未找到返回-1
//BF(朴素查找算法)

#include<stdio.h>
#include<string.h>
#include<assert.h>


int BF(const char* str, const char* sub, int pos)
{
	assert(str != NULL);
	if (str == NULL || sub == NULL)
		return -1;
	if (pos > strlen(str)||pos<0)
		return -1;
	if (strlen(sub) > strlen(str))
		return -1;
	int lenstr = strlen(str);
	int lensub = strlen(sub);
	int i = pos;
	int j = 0;
	while (i < lenstr && j < lensub)
	{
		if (str[i] == sub[j])
		{
			i++;
			j++;
		}
		/*else
		{
			pos++;
			i = pos;
			j = 0;
		}*/
		else
		{
			i = i - j + 1;
			j = 0;
		}
	}
	//if (sub[j] == '\0')
	//	return pos;
	if (j = lensub)
		return i - j;
	else
		return -1;

}


int main()
{
	const char* str1 = "ababcabcdabcde";
	const char* str2 = "abcd";
	const char* str3 = "abc";


	printf("%d  ", BF(str1, str2, 0));
	printf("%d  ", BF(str1, str2, 5));
	printf("%d  ", BF(str1, str2, 9));

	return 0;
}

4.总结

(1)在主串str的pos位置查找子串sub,找到返回下标,未找到返回-1

(2)思想:相等继续比较,不相等回退,回退时i推到刚才的位置的下一个(i-j+1)

j退到0

(3)利用子串是否遍历完成,来判断查找是否成功,注:不能利用主串来判断

(4)算法时间复杂度BF:O(n*m)

标签:BF,sub,int,pos,算法,str,字符串
From: https://blog.csdn.net/yk_18/article/details/136835973

相关文章

  • 字符函数与字符串函数
    目录1.字符分类函数1.1isupper函数1.2islower函数2. 字符转换函数3.strlen的使⽤和模拟实现4.strcpy的使⽤和模拟实现5.strcat的使⽤和模拟实现6. strcmp的使⽤和模拟实现7.strncpy函数的使⽤8.strncat函数的使⽤9.strncmp函数的使⽤10.strstr的使⽤和模拟......
  • 算法打卡day25|回溯法篇05|Leetcode 491.递增子序列、46.全排列、47.全排列 II
     算法题Leetcode491.递增子序列题目链接:491.递增子序列大佬视频讲解:递增子序列视频讲解 个人思路和昨天的子集2有点像,但昨天的题是通过排序,再加一个标记数组来达到去重的目的。而本题求自增子序列,是不能对原数组进行排序的,因为排完序的数组都是自增子序列了。解决......
  • 机器人路径规划:基于霸王龙优化算法(Tyrannosaurus optimization,TROA)的机器人路径规划(提
     一、机器人路径规划介绍移动机器人(Mobilerobot,MR)的路径规划是移动机器人研究的重要分支之,是对其进行控制的基础。根据环境信息的已知程度不同,路径规划分为基于环境信息已知的全局路径规划和基于环境信息未知或局部已知的局部路径规划。随着科技的快速发展以及机器人的大量......
  • 代码随想录算法训练营第五十四天| ● 392.判断子序列 ● 115.不同的子序列
    判断子序列 题目链接:392.判断子序列-力扣(LeetCode)思路:从子串s开始遍历,查找t中是否存在,因为全程不需要回溯,因此两个for循环就解决了。只是要注意return的时机。(只要不想写的很简洁,逻辑挺简单的其实)classSolution{public:boolisSubsequence(strings,stringt){......
  • 【BFS】(代码详解)
    全面学习BFS的可以参照以下路径,本文章只附上部分代码的解释作为学习记录共勉(星星眼)原文链接:https://blog.csdn.net/m0_62881629/article/details/125072287给定一个n×mn×m的二维整数数组,用来表示一个迷宫,数组中只包含00或11,其中00表示可以走的路,11表示不可通过......
  • 获取字符串长度LEN
    selectLEN('asd')--结果:{3}去除空格LTRIM、RTRIM、TRIMselectLTRIM('  444 5 ')--去除字符串左边的空格,结果:{444 5}selectRTRIM('  444 5 ')--去除字符串右边的空格,结果:{  444 5}selectTRIM('  444 5 ')--去除字符串两边的空格,结果:{444 5}......
  • 算法练习第三十天|两道hard51. N 皇后、37. 解数独
    37.解数独51.N皇后解数独classSolution{publicvoidsolveSudoku(char[][]board){backTrace(board);}publicbooleanbackTrace(char[][]board){//仅收集一个结果for(inti=0;i<9;i++){for(intj......
  • 1.基于搜索的路径规划:BFS、DFS、Dijkstra、A*、JPS
    1.概览可以对比不同算法的小动画 PathFinding.js(qiao.github.io)工作空间规划机器人有不同的形状和大小碰撞检测需要了解机器人的几何形状,耗时且难度大 我们希望将机器人表示为点,只需要把工作空间转换为配置空间C-obstacle,将原始的空间膨胀,这是一次性的C-space......
  • 二分算法查找列表中的目标值
    题目要求:给定一个已排序的非重复整数数组和一个目标值,如果找到目标,则返回索引。如果不是,返回索引按顺序插入时的位置。(用二分法查找解决)示例1:输入:[1,3,5,6],目标值5输出:2示例2:输入:[1,3,5,6],目标值2输出:1示例3:输入:[1,3,5,6],目标值7输出:4示例4:输入:[......
  • 多维背包问题动态规划算法
    #include <iostream>  #include <vector>  using namespace std;//定义物品结构体 struct Item {    int id;    int weight;    int volume;    int value;};//初始化背包的容量限制 const int MAX_WEIGHT=50;const ......