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

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

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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • VS 2013安装教程「建议收藏」

    VS 2013安装教程「建议收藏」1.下载资源此版本是旗舰版,其他版本自行下载http://download.microsoft.com/download/9/3/E/93EA27FF-DB02-4822-8771-DCA0238957E9/vs2013.5_ult_chs.iso?type=ISO2.装载光盘3.右击应用程序,选择“以管理员身份运行”4.选择安装路径并同意许可,点击下一步。5.选择安装的功能(根据自己需要选择),点击安装6.等待安装即可7….

  • zigzag扫描matlab,ZIGZAG扫描的MATLAB实现

    zigzag扫描matlab,ZIGZAG扫描的MATLAB实现转自阿须数码,用MATLAB实现MPEG中的ZIG-ZAG扫描。觉得有点研究价值,实现的方法也很巧妙。下面给一个参照MPEG提供的方法:===functionb=zigzag(a)%这是参照UniversityofCalifornia提供的MPEG源代码的基础上编制的。%Copyright(c)1995TheRegentsoftheUniversityofC…

    2022年10月21日
  • 你知道如何从零开始学c++游戏编程吗「建议收藏」

    你知道如何从零开始学c++游戏编程吗「建议收藏」在软件开发中,游戏开发这个方向看起来目标很明确,但其实是个领域很广的方向,入门的时候如果得不到指点一二,很容易误入歧途,相反,如果走这条路之前能得到前人的一些指路,是可以事半功倍的。平台与编程语言选择首先,游戏开发的平台就有很多类型:个人主机平台:Windows、Linux、MacOC;移动平台:iOS、Android、WindowsPhone、BlackBerryOS、Symbian;专业主…

  • chmod- linux修改文件权限[通俗易懂]

    chmod- linux修改文件权限[通俗易懂]在Unix和Linux的各种操作系统下,每个文件(文件夹也被看作是文件)都按读、写、运行设定权限。例如我用ls-l命令列文件表时,得到如下输出:-rw-r–r–1appleusers22542006-05-2013:47tt.htm从第二个字符起rw-是说用户apple有读、写权,没有运行权,接着的r–表示用户组users只有读权限,没有运行权,最后的r–指其他人(others)只有读权限,没有写权和运行权。这是系统默认设置,我可以改写tt.htm,同组的人和其他

  • mysql数据库连接配置文件(db.properties)

    mysql数据库连接配置文件(db.properties)db.driver=com.mysql.jdbc.Driverdb.url=jdbc:mysql://localhost:3306/learn-test?useUnicode=true&characterEncoding=utf8db.username=rootdb.password=123456说明:如url使用的是本地数据库且端口是3306,可以省略lo…

  • 安卓转移到苹果手机_苹果手机更换安卓手机怎么备份

    安卓转移到苹果手机_苹果手机更换安卓手机怎么备份通常我们使用手机时间长了之后,手机开始变得卡顿,常常出现内存不足的情况。这种时候不外乎两种情况:一是将手机格式化或还原出厂设置;二是买个新手机。这样做的结果就是手机的数据被删除或是数据留在旧手机内却不能完整的转移到新手机中。那我们该怎么做才能两全其美呢?下面小编就来介绍关于安卓手机和苹果手机如何备份和恢复手机数据的使用方法。一、安卓手机的备份和恢复小米手机里有一个特别的功能

发表回复

您的电子邮箱地址不会被公开。

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