蛮力法 字符串匹配

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

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

概述

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

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

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

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

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

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

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

#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;
}
//注:两种方法的实现的方法都是一模一样的唯一不同是在于对字符串的处理方面。

时间: 2024-10-13 08:51:23

蛮力法 字符串匹配的相关文章

关于算法--蛮力法--字符与字符串匹配

一.顺序查找 1.步骤:简单的将给定列表中的连续元素与给定的查找键作比较,直到遇到一个匹配的元素或遇到匹配元素前就遍历了整个列表 2.JavaScript代码实现 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>SelectionFind</title> 6 </head>

蛮力法-顺序查找和字符串匹配

时间总让我有后知后觉的挫感,而我,总是习惯于四处张望. 3.2.1 顺序查找 将数组中的元素和给定的查找键进行比较,直到成功匹配,或者遍历完整个数组,查找失败.可将查找键添加到数组末尾,这样就不必每次循环时都检查是否到达了表的末尾(然并卵,数组不方便在添加元素吧). 代码实现: /** * 顺序查找 * @param array 对象数组 * @param key 查找键 * @return 查找成功返回元素下标,失败返回-1 * */ public static int sequentialS

算法——蛮力法之顺序查找和蛮力字符串匹配

接着昨天的选择排序和冒泡排序之后,今天来实现一下顺序查找和蛮力字符串匹配两个算法. 顺序查找就是将给定的查找键和列表周玲的每个元素进行比较,直到找到一个匹配成功的元素返回该元素下标,查找成功,或者查找整个列表二没有匹配元素,查找失败.这里记录一下限位器版顺序查找方法.限位器就是指将查找键添加到列表最后,这样在查找的过程中,不用再每次都判断是否到达列表尾部来判断查找是否失败,而是在查找结束后,判断匹配元素下标是否小于n(假设列表有n个元素)来判断查找是否成功.下面是限位器版顺序查找算法: 限位器版

[算法系列之十二]字符串匹配之蛮力匹配

引言 字符串匹配是数据库开发和文字处理软件的关键.幸运的是所有现代编程语言和字符串库函数,帮助我们的日常工作.不过理解他们的原理还是比较重要的. 字符串算法主要可以分为几类.字符串匹配就是其中之一.当我们提到字符串匹配算法,最基本的方法就是所谓的蛮力解法,这意味着我们需要检查每一个文本串中的字符是否和匹配串相匹配.一般来说我们有文本串和一个匹配串(通常匹配串短于文本串).我们需要做的就是回答这个匹配串是否出现在文本串中. 概述 字符串蛮力匹配法的原理非常简单.我们必须检查匹配串的第一个字符与文本

字符串匹配 — Horspool

蛮力法进行字符串匹配的缺点在于每次失配后模式只向后移动一个位置.想要提高算法效率,就必须在不错过文本中一个匹配子串风险的前提下,尽量增大模式向后移动的幅度.Horspool就是这样一种算法之一,它的思想要比KMP算法容易.它采用了输入增加技术:对模式进行预处理得到一些信息,把这些信息存储在表中,当文本和模式进行匹配时就会用到这些信息.Horspool的匹配过程是从右向左进行的,在匹配过程中会出现以下四种情况: 情况1 文本:x x x x A x x x x x 模式:    x x B 最后一

字符串匹配与KMP算法笔记

>>字符串匹配问题 字符串匹配问题即在匹配串中寻找模式串是否出现, 首先想到的是使用暴力破解,也就是Brute Force(BF或蛮力搜索) 算法,将匹配串和模式串左对齐,然后从左向右一个一个进行比较, 如果不成功则模式串向右移动一个单位,直到匹配成功或者到达匹配串最后仍然不成功,返回失败. 很明显,这种算法有很多的地方可以优化,假设要搜索的串为S,长度为n,要匹配的串为M,长度为m,时间复杂度为O(nm). >>KMP算法 Knuth-Morris-Pratt算法以三个发明者命名

时空权衡之字符串匹配中的输入增强技术

字符串匹配的蛮力的算法: 对于字符数为n的文本,模式(要匹配的字符串)字符为m的字符串,简单的从左到右比较模式和文本中每一对相应的字符,,如果不匹配,模式向右移一格,再进行下一轮的尝试. 这样尝试的最大次数为n-m+1次,模式进行m次比较,这样比较次数一共是m(n-m+1)=O(nm),次,对于随机的自然文本,它的平均效率为O(n+m) 使用输入增强的思想:对模式进行预处理以得到它的一些信息,把这些信息储存在表中,然后在给定文本中实际查找模式时使用这些信息. 以下是这种思维下的两种算法: 一.H

字符串匹配之---BF算法(暴力破解法)

写完第一篇字符串匹配文章.发现居然没有介绍啥是字符串匹配算法.啥是KMP,直接就开讲KMP的next数组有点唐突.而在我打算写第二篇的时候发现,我们为什么要有KMP算法,它究竟比普通的算法好在哪里?回过头来想想应该把普通的暴力法也写写,这样才干明确它们的好.同一时候.不要以为它是暴力法就觉得它不好,你不是必需掌握它.同学.你知道吗?差点儿全部标准库中类似字符串匹配的函数(如: java-indexof)都是採用的我们今天要将的BF(Brute Force)方法,原因见noredirect=1#c

[算法系列之二十六]字符串匹配之KMP算法

一 简介 KMP算法是一种改进的字符串匹配算法,由D.E.Knuth与V.R.Pratt和J.H.Morris同时发现,因此人们称它为克努特-莫里斯-普拉特操作(简称KMP算法).KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的. 二 基于部分匹配表的KMP算法 举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含搜索串"ABCDABD"? 步骤1:字符串"BBC ABC