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

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

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

引言

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

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

概述

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

这里写图片描述
我们通过比较文本串的和匹配串的第一个字符来开始

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

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

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

这里写图片描述
如果文本串的一个字符和匹配串的第一个字符相匹配,我们向前移动到匹配串第二个字符和文本串的下一个字符做匹配

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

这里写图片描述
匹配串相匹配

代码

/*-------------------------------- * 日期:2015-02-05 * 作者:SJF0115 * 题目: 字符串匹配之蛮力匹配 * 博客: ------------------------------------*/
#include <iostream>
using namespace std;


int SubString(string text,string pattern){
    int m = text.size();
    int n = pattern.size();
    // 蛮力匹配
    for(int i = 0;i < m - n;++i){
        int j = 0;
        while(j < n && text[i+j] == pattern[j]){
            ++j;
        }//while
        // match
        if(j == n){
            return i;
        }//if
    }//for
    return -1;
}

int main(){
    string text("hello world!");
    string pattern("o wo");
    int result = SubString(text,pattern);
    cout<<"下标位置->"<<result<<endl;
    return 0;
}

复杂度

就像我说的这个算法是缓慢的。实际上每一个算法,只要在它的名字中包含“蛮力”二字,这个算法都是很缓慢的,其时间复杂度是O(n*m)。这里m是文本串的长度,而n是匹配串的长度。

原文连接

Computer Algorithms: Brute Force String Matching

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/171732.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 效率倍增,推荐6个好用到爆的Pycharm插件

    效率倍增,推荐6个好用到爆的Pycharm插件相信对于不少的Python程序员们都是用Pycharm作为开发时候的IDE来使用的。今天我来分享几个好用到爆的Pycharm插件,在安装上之后,你的编程效率、工作效率都能够得到极大地提升。喜欢本文点赞、收藏、关注。部分插件技术群朋友分享,在此表示感谢。【文末】提供技术交流群安装方法插件的安装方法一点都不难打开file—settings—plugins,在右侧的文本框中输入想要查看的插件名称,在下方就会罗列出已经安装的相关的插件找到我们所需要的对应插件之后,点击install即可完成下载,然后重

    2022年8月29日
    0
  • android declare-styleable 和style,Android 关于declare-styleable属性的写法….

    android declare-styleable 和style,Android 关于declare-styleable属性的写法….我想问自定义View的时候,以下这段代码,为何要写两次一样的名称呢?我看了一些资料,说写在declare-styleable系统会自动生成数组…..我不太明白这实际应用是什么?如果说自动帮你生成了数组,方便使用,那写在外面的三个又有什么作用?能从实际应用中讲一讲吗?<?xmlversion=”1.0″encoding=”utf-8″?><resources><at…

    2022年7月13日
    13
  • 用matlab产生时域离散信号实验报告(有关数字信号处理)

    1.正弦序列离散正弦序列的MATLAB表示与连续信号类似,只不过是用stem函数而不是用plot函数来画出序列的波形。下面就是正弦序列的MATLAB源程序。%正弦序列实现程序k=0:39;fk=sin(pi/6*k);stem(k,fk)2.指数序列离散指数序列的一般形式为,可用MATLAB中的数组幂运算(即点幂运算)c*来实现。下面为用MATLAB编写绘制离散时

    2022年4月10日
    196
  • 史上最简单的 SpringCloud 教程 | 第一篇: 服务的注册与发现(Eureka)[通俗易懂]

    史上最简单的 SpringCloud 教程 | 第一篇: 服务的注册与发现(Eureka)[通俗易懂]springcloud为开发人员提供了快速构建分布式系统的一些工具,包括配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等等。它运行环境简单,可以在开发人员的电脑上跑。另外说明springcloud是基于springboot的。本文主要介绍了服务的注册与发现。

    2022年4月28日
    56
  • Java 内部静态类_静态内部类特点

    Java 内部静态类_静态内部类特点Java中的内部类是在Jdk1.1版本之后增加的,内部类是Java语言中一个比较重要的概念,如果能把内部类运用好,那么会明显增强Java程序的灵活性。要想清楚static内部类和非static内部类的区别,首先要了解内部类的概念及特点,然后再进行一个全面的对比。什么是内部类呢?简单的说就是在一个类的内部又定义了一个类,这个类就称之为内部类(InnerClass)。看一个简单的例子:内…

    2022年10月11日
    0
  • Pycharm和Pytorch安装教程配置环境以及遇到的问题:

    Pycharm和Pytorch安装教程配置环境以及遇到的问题:Pycharm和Pytorch安装教程配置环境以及遇到的问题:注意:我们每次新建完项目,都要检查一下python解释器和conda.exe是否选择正确。一.如何找到Anconda哪个环境中安装了pytorch?Anconda提供环境,我们安装pytorch也是在一个环境下,所以不是在每个环境中都能用pytorch。那么我们如何找到我们pytorch安装的环境呢?要有NVDIA的显卡,才能用CUDA(AMD的小伙伴可能泪目了),查CUDA的版本比较简单,就不总结了。打开Anconda,输入conda

    2022年8月27日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号