蛮力法字符串匹配

author author     2022-08-20     525

关键词:

字符串匹配是数据库开发和文字处理软件的关键。幸运的是所有现代编程语言和字符串库函数,帮助我们的日常工作。不过理解他们的原理还是比较重要的。

字符串算法主要可以分为几类。字符串匹配就是其中之一。当我们提到字符串匹配算法,最基本的方法就是所谓的蛮力解法,这意味着我们需要检查每一个文本串中的字符是否和匹配串相匹配。一般来说我们有文本串和一个匹配串(通常匹配串短于文本串)。我们需要做的就是回答这个匹配串是否出现在文本串中。

概述

字符串蛮力匹配法的原理非常简单。我们必须检查匹配串的第一个字符与文本串的第一个字符是否相匹配,就如下图片所述。

 
我们通过比较文本串的和匹配串的第一个字符来开始

如果他们不匹配我们移向文本串的第二个字符。现在我们比较匹配串的第一个字符和文本串第二个字符。如果他们不匹配我们继续向前移动,直到我们遇到一个相匹配的或直到我们到达文本串的最后。

 
因为文本串第一个字符和匹配串的第一个字符不匹配,我们向前移动到文本串的的第二个字符。现在我们比较文本串的第二个字符和匹配串的第一个字符!

假设第一个字符匹配,我们移向匹配串的第二个字符去和文本串的下一个字符比较。如下面图片所示。

 
如果文本串的一个字符和匹配串的第一个字符相匹配,我们向前移动到匹配串第二个字符和文本串的下一个字符做匹配

如果仅仅是因为匹配串的第一个字符与文本串的某个字符相匹配,那并不意味着这个匹配串出现在文本串中,也仅仅是第一个字符出现在文本串中,其他说明不了。我们必须向前移动匹配串,看看完整的匹配串是否包含在文本文本串中。

 

#include "stdafx.h"
#include<iostream>
#include<vector>
using namespace std;
/*int main()
{
int n;
cin>>n;
vector<char>A(n);
for(int i=0;i<n;i++)
{
cin>>A[i];
}
int m;
cin>>m;
vector<char>B(m);
for(int i=0;i<m;i++)
{
cin>>B[i];
}
int j;
for(int i=0;i<n-m;i++)
{
j=0;
while(j<m&&B[j]==A[i+j])
{
j++;
if(j==m)
{
cout<< i<<endl;
}
cout<< -1<<endl;
}
}
return 0;
}*/
//注:以上是来自课本的实现方法,由于本人自己对这原理虽然有一定理解但实现还是有一定的瑕疵,所以参照了网上的解法
int BruceForceStringmatch(string text,string pattern)
{
//分别得到文本和模式的长度
int n=text.size();
int m=pattern.size();
//开始蛮力字符匹配
for(int i=0;i<n-m;i++)
{
int j=0;
while(j<m&&text[i+j]==pattern[j])
{
j++;
}
if(j==m)
{
return i;
}
}
return -1;

}
int main()
{
string text("hello world!");
string pattern("o wo");
int result=BruceForceStringmatch(text,pattern);
cout<<result<<endl;
return 0;
}
//注:两种方法的实现的方法都是一模一样的唯一不同是在于对字符串的处理方面。

算法笔记_009:字符串匹配蛮力法

1问题描述给定一个n个字符组成的串(称为文本),一个m(m<=n)的串(称为模式),从文本中寻找匹配模式的子串。 2解决方案2.1具体编码packagecom.liuzhen.chapterThree;publicclassBruteForceStringMatch{//根据文本串N,和模式串M,返回... 查看详情

算法笔记_008:选择排序和冒泡排序蛮力法

...描述给定一个可排序的n元素序列(例如,数字、字符和字符串),将它们按照非降序方式重新排列。2解决方案2.1选择排序原理简介选择排序开始的时候,我们从第一个元素开始扫描整个列表,找到它的最小元素,然后和第一个... 查看详情

蛮力法求解旅行商

usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;usingSystem.Windows.Forms;name 查看详情

01背包的蛮力法实现

//01背包问题蛮力法publicvoidbackPage(int[]w,int[]v,intiMax)intmaxValue=0;//当前最大价值intweight=0;//当前最大价值对应的重量Listresult=null;//当前最优的搭配ArrayList<ArrayList<Integer>>allSet=newArrayList<>();//用于 查看详情

蛮力法——冒泡排序

冒泡排序是蛮力法的另一个经典体现。算法思想:比较列表中相邻的元素,如果是逆序的话,就交换他们的位置。重复多次之后,最大的元素就排到了最后一个位置。第二遍操作将第二个元素排到了倒数第二个位置上,这样一直... 查看详情

系统地解决代数(蛮力法)

】系统地解决代数(蛮力法)【英文标题】:systematicallysolvealgebra(bruteforcemethod)【发布时间】:2018-05-2520:51:33【问题描述】:我已经四处搜索并尝试过自己,但不知道该怎么做。我有一个方程式,比如a^2+b^2=c^2。我想使用JavaScript(... 查看详情

找犯人——蛮力法(算法)(代码片段)

...;(6)如果D没有参与作案,则E也不可能参与作案。试用蛮力法设计算法将作案人找出来。 1#include<iostream>2#include<cstdio& 查看详情

java每日一题——>739.每日温度(蛮力法,栈方法)(代码片段)

文章目录题目题解1(蛮力法)代码实现复杂度分析题解2(栈方法)代码实现复杂度分析题目这是LeetCode上的[739,每日温度],难度为[中等]请根据每日气温列表temperatures,请计算在每一天需要等几天才会有更高的温度。如果... 查看详情

python动态演示蛮力法解决凸包问题(代码片段)

...非常简单,只是自己不知道的函数太多了,哭了。。。。蛮力法就不用解释了,通俗的说就是把所有可能试一遍。凸包问题,就是将n个点中某几个点围成一个多边形,除了这n个点,其余的点都在这个多边形内。核心算法其实就... 查看详情

3.1.1蛮力法之选择排序

    选择排序开始的时候,我们扫描整个列表,找到它的最小元素,然后和第一个元素交换,将最小元素放到它在有序表中的最终位置上。然后我们从第二个元素开始扫描列表,找到最后n-1个元素中的最小元素,再... 查看详情

算法——蛮力法之最近对问题和凸包问题

  上次的博客写到一半宿舍停电了。。。。然而今天想起来补充完的时候发现博客园并没有自动保存哦,微笑。  首先来看最近对问题,最近对问题描述的就是在包含n个端的集合中找到距离最近的两个点,当然问题也可以... 查看详情

java每日一题——>739.每日温度(蛮力法,栈方法)(代码片段)

文章目录题目题解1(蛮力法)代码实现复杂度分析题解2(栈方法)代码实现复杂度分析题目这是LeetCode上的[739,每日温度],难度为[中等]请根据每日气温列表temperatures,请计算在每一天需要等几天才会有更高的温度。如果... 查看详情

算法设计与分析--求最大子段和问题(蛮力法分治法动态规划法)c++实现(代码片段)

...0c;当所有整数均为负整数时,其最大子段和为0。利用蛮力法求解:intmaxSum(inta[],intn) intmaxSum=0; intsum=0; for(inti=0;i 查看详情

大数相乘-蛮力法(代码片段)

输入:a=1234  b=1234,求a*b的值。(小的数能看得清晰)问题思路:在运用笔算时的方法为:两个数相乘的结果的位数一定不大于这两个数的长度总和。将红色区域的数存入数组中,判断大于10的进1,最后求出得数1522756。... 查看详情

排序算法1——冒泡排序

...冒泡排序之前,优先介绍一种算法设计的策略——蛮力法。这是一种简单直接的解决问题的方法,常常直接基于问题的描述和所涉及的定义。由于蛮力法是基于问题的定义来思考的,那么可以说它是一种几乎什么问题都能... 查看详情

bf算法(蛮力匹配算法)(代码片段)

...字符和S的开始位置对比,直到S中每一个字符和M中的连续字符串相等,否则不匹配。C#代码-->privatestaticintIndex(stringm,intpos,strings)intm_len=m.Length;ints_len=s.Length;inti=pos-1;int 查看详情

java每日一题——>剑指offerii035.最小时间差(三解,蛮力,排序,哈希)(代码片段)

文章目录题目题解1(蛮力法)代码实现复杂度分析题解2(排序)代码实现复杂度分析题解3(哈希表)代码实现复杂度分析题目这是LeetCode上的[035,最小时间差],难度为[中等]给定一个24小时制(小时:分钟“HH:MM”&#... 查看详情

bf算法(蛮力匹配)(代码片段)

输入主串a,模式bb在a中的位置1.在串a和串b中设置比较的下标i=0,j=0;2.重复下述操作,直到a或b的所有字符均比较完毕:  2.1如果a[i]等于b[i],继续比较a和b的下一对字符;  2.2负责,下标i和j分别回溯,开始下一趟匹配;3.... 查看详情