字符串匹配算法第一篇——暴力匹配

字符串匹配是一项重要的内容,本处我们讨论的字符串匹配是完全匹配,也就是找出子字符串在父字符串中的匹配位置。

例如:父字符串:EDGRNGIGEDEDGEDGLGDEDG,子字符串:EDG;则需要知道“EDG”在父字符串中的位置。先上代码:

 1 //使用暴力穷举法完成字符串匹配算法
 2 # include "iostream"
 3 #include"string"
 4 #include"vector"
 5 using namespace std;
 6 vector<int>& BFmatch(string & , string & , vector<int>&);
 7 void ShowPos(vector<int>& );
 8 int main()
 9 {
10     string ModelStr, SonStr;
11     vector<int> pos;
12     cout << "请输入待匹配字符串:";
13     cin >> ModelStr ;
14     cout << endl;
15     cout << "请输入子字符串:";
16     cin >> SonStr;
17     cout << endl;
18     BFmatch(ModelStr, SonStr, pos);
19     ShowPos(pos);
20     system("pause");
21 }
22 vector<int>& BFmatch(string & ModelStr, string & SonStr,vector<int>& pos)
23 {
24     for (int i = 0; i < ModelStr.size(); i++)
25     {
26         int k = 0;
27         for (int j = i; k < SonStr.size(); j++, k++)
28         {
29             if (SonStr[k] == ModelStr[j])
30                 continue;
31             else
32                 break;
33         }
34         if (k == SonStr.size())
35             pos.push_back(i);
36     }
37     return pos;
38 }
39 void ShowPos(vector<int>& pos)
40 {
41     if (pos.size() != 0)
42     {
43         cout << "the first position of MatchingStr:";
44         for (int i = 0; i < pos.size(); i++)
45         {
46             cout << pos[i] << "\t";
47         }
48         cout << endl;
49     }
50     else
51         cout << "no such string!" << endl;
52 }

需要说明的是:函数BFmatch的返回类型为vector<int>&,返回类型为引用类型。需要理解的是为什么这里返回来的是vector<int>& 类型?

我们需要明确的一点是:函数的返回类型是:函数返回值的类型!!!这句话很重要。返回值是pos变量,pos变量类型是传递在形参里面;而在形参中pos的类型是vector<int>&。这里为什么是vector<int>&类型,可能我们会想到说是我们的初衷是返回一个存储匹配位置的向量,空间比较大,采用这种方式可以节省空间,采用值传递的方式不节省开销。还有没有别的解释呢?

的确,我们假设不考虑这个空间节省的问题。甚至不传递pos变量,最后让这个函数返回一个局部变量,最终将这个局部变量赋值给main函数中的pos,这当然也是可以的,但是这其中不仅仅带来了空间开销,更重要的是程序设计理念。

这个设计里面是:一个函数的名字和形参,从功能和接口的角度看,我们希望包含:程序名、输入接口,输出接口。也就是我们希望每个函数的返回值(也就是我们的输出)直接反映在函数体抬头。(在opencv的库中大量使用了这种手法)。也就是:函数名,输入端子,输出端子 来描述函数是一种更为科学的表述方式。而我们要想将输出端子作为一种公共接口,自然不能使用局部变量的方式,局部变量只在本作用域起作用。因此我们需要使用一种公共接口的方式来定义输出端子,而采用引用传递就是一种公共接口的实现方式(当然还有其他方式)。

因此,在后续的程序设计中,考虑函数名,输入接口,输出接口的方式来看待程序设计,是一种更为高级的抽象方式。

原文地址:https://www.cnblogs.com/shaonianpi/p/11403960.html

时间: 2024-10-11 04:08:39

字符串匹配算法第一篇——暴力匹配的相关文章

4种字符串匹配算法:BS朴素 Rabin-karp 有限自动机 KMP(上)

字符串的匹配的算法一直都是比较基础的算法,我们本科数据结构就学过了严蔚敏的KMP算法.KMP算法应该是最高效的一种算法,但是确实稍微有点难理解.所以打算,开这个博客,一步步的介绍4种匹配的算法.也是<算法导论>上提到的.我会把提到的四种算法全部用c/c++语言实现.提供参考学习.下图的表格,介绍了各个算法的处理时间和匹配时间.希望我写的比较清楚.如果不理解的,或者不对的,欢迎留言. 字符串匹配算法及其处理时间和匹配时间 算法 预处理时间 匹配时间 朴素算法 0 O((n-m+1)m) Rabi

字符串匹配算法

字符串匹配问题的形式定义: 文本(Text)是一个长度为 n 的数组 T[1..n]: 模式(Pattern)是一个长度为 m 且 m≤n 的数组 P[1..m]: T 和 P 中的元素都属于有限的字母表 Σ 表: 如果 0≤s≤n-m,并且 T[s+1..s+m] = P[1..m],即对 1≤j≤m,有 T[s+j] = P[j],则说模式 P 在文本 T 中出现且位移为 s,且称 s 是一个有效位移(Valid Shift). 比如上图中,目标是找出所有在文本 T=abcabaabcaba

字符串匹配算法KMP详细解释——深入理解

1. 前言 字符串匹配是一个经典算法问题,展开来讲各类问题多达几十种,有名称的算法也不下三十种,所以需要深入学习的东西有很多.这次我们来探讨一个最简单的问题,假设现在随机输入一个长度为m的主串T,另外输入一个长度为n(n≤m)的字符串P,我们来判断字符串P是否是主串T的一个子串(即能否从T中随机取出与P同长的一段字符串,与P完全匹配). 2. 蛮力匹配法 问题很简单,当然也有最直接.最直观也是最好想到的方法,蛮力串匹配.即两个字符串像物流传送带一般,主串固定,子串一步步像前移动,一位位匹配比较,

MySTL: BM算法和Sunday快速字符串匹配算法

BM算法研究了很久了,说实话BM算法的资料还是比较少的,之前找了个资料看了,还是觉得有点生涩难懂,找了篇更好的和算法更好的,总算是把BM算法搞懂了. 1977年,Robert S.Boyer和J Strother Moore提出了另一种在O(n)时间复杂度内,完成字符串匹配的算法,这个算法在单模匹配上比KMP算法还要出色 PS:其BM算法在跳转优化上的确比KMP算法要好很多,能在O(N)的上界就完成匹配了,但是不是绝对的,我们讲到后面再来说这个问题. 我们知道,KMP算法之所以能那么快,是因为他

典型字符串匹配算法实现 - 单字符串匹配算法

博客源址:http://www.jimye.com/dian-xing-zi-fu-chuang-pi-pei-suan-fa-shi-xian/ 提示:要继续向下看 相信大家对快捷键ctrl+F是做什么用的都应该很熟悉了,无论是文本编辑.网页浏览等程序上它都意味着字符串搜索,我们提供一个关键字,它将找到当前页面上的所有该关键字所在的位置.关键字称为模式串,在文本T中寻找模式串P出现的所有出现的位置,解决这种问题的算法叫做字符串匹配算法.字符串匹配算法可以说是计算机科学中最古老.研究最广泛的问题

KMP字符串匹配算法——用最容易理解的方式描述

看了数据结构书上对于快速模式匹配算法KMP的介绍,感觉云里雾里.本文根据自己理解,并查资料整理了一种非常清晰简单的字符串匹配算法,并给予实现,自诩原创吧. 字符串匹配是我们经常要用到的一种算法,与普通的匹配算法相比KMP算法效率更高,时间复杂度为O(m+n).下面给予详细讲解: 概念详解 设原字符串为"BBC ABCDAB ABCDABCDABDE",待匹配字符串为"ABCDABD". 首先,字符串"BBC ABCDAB ABCDABCDABDE"

字符串匹配算法的分析【转】

转自:https://www.cnblogs.com/adinosaur/p/6002978.html 问题描述 字符串匹配问题可以归纳为如下的问题:在长度为n的文本T[1...n]中,查找一个长度为m的模式P[1...m].并且假设T,P中的元素都来自一个有限字母集合?.如果存在位移s,其中0≤s≤n-m,使得T[s+1..s+m] = P[1..m].则可以认为模式P在T中出现过. 1. 朴素算法 最简单的字符串匹配算法是朴素算法.该算法最直观,通过遍历文本T,对每一个可能的位移s都比较T[

微软面试100题系列:字符串匹配算法,查找包含字符集的子串

觉得这题挺有意思,看了别的博客,找到了一种目前看来还不错的算法,为强化理解,就写了下来. 题目意思: 实现一个挺高级的字符匹配算法: 给一串字符串,要求找到符合要求的字符串,例如对于目的串:123,那么给定字符串中诸如1******3*****2,12******3这些形式的子串都要找出来,即子串中含有目的串的所有字符,输出所有符合条件的字符串,并求出最短子串 .类似于和谐系统. 例如:假如目的串为:"423",输入长字符串为:"4fsdfk2jfl3fd2jfksd3j4d

多模字符串匹配算法之AC自动机—原理与实现

简介: 本文是博主自身对AC自动机的原理的一些理解和看法,主要以举例的方式讲解,同时又配以相应的图片.代码实现部分也予以明确的注释,希望给大家不一样的感受.AC自动机主要用于多模式字符串的匹配,本质上是KMP算法的树形扩展.这篇文章主要介绍AC自动机的工作原理,并在此基础上用Java代码实现一个简易的AC自动机. 欢迎探讨,如有错误敬请指正 如需转载,请注明出处 http://www.cnblogs.com/nullzx/ 1. 应用场景-多模字符串匹配 我们现在考虑这样一个问题,在一个文本串t