字符串匹配——枚举法[通俗易懂]

字符串匹配——枚举法[通俗易懂]字符串匹配——枚举法给定主串T和模式串P,返回P在T中首次出现的位置,如果P不存在于T中,返回-1。这样的问题就是字符串匹配问题,这里先给出枚举法的思想。设主串T的长度为n,模式串P的长度为m。主串从0到n-m,每次选取连续的m个字符,跟模式串P的m个字符进行一一比较。伪代码BruteForce(T,P)01fors<-0ton-m02j<-003//check

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

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

字符串匹配——枚举法

给定主串T和模式串P,返回P在T中首次出现的位置,如果P不存在于T中,返回-1。

这样的问题就是字符串匹配问题,这里先给出枚举法的思想。

设主串T的长度为n,模式串P的长度为m。

主串从0到n-m,每次选取连续的m个字符,跟模式串P的m个字符进行一一比较。

伪代码

BruteForce(T, P)
01 for s <- 0 to n - m
02  j <- 0
03  // check if T[s...s+m-1] = p[0...m-1]
04  while T[s+j] = P[j] do
05      j <- j + 1
06      if j = m then return s;
07 return -1

实现代码

// 布鲁特逼近法也就是穷举法
int bruteForce(const string &T,const string &P) {
    // 主串的长度
    int n = T.length();
    // 模式串的长度
    int m = P.length();
    for(int i = 0; i <= n - m; i++) {
        // 比较串T[i...i+m-1]和P[0...m-1]
        for(int j = 0; j < m; j++) {
            // 匹配失败则T指向下一个元素
            // P从零开始
            if(T[i + j] != P[j]) {
                break;
            }
            // 在主串中找到模式串
            if(j == m - 1) {
                // 返回模式串在主串的最早出现位置
                return i;
            }
        }
    }
    // 未在主串中找到模式串
    return -1;
}

测试主程序

#include <iostream>
#include <string>

using namespace std;

// 布鲁特逼近法也就是穷举法
int bruteForce(const string &T,const string &P) {
    // 主串的长度
    int n = T.length();
    // 模式串的长度
    int m = P.length();
    for(int i = 0; i <= n - m; i++) {
        // 比较串T[i...i+m-1]和P[0...m-1]
        for(int j = 0; j < m; j++) {
            // 匹配失败则T指向下一个元素
            // P从零开始
            if(T[i + j] != P[j]) {
                break;
            }
            // 在主串中找到模式串
            if(j == m - 1) {
                // 返回模式串在主串的最早出现位置
                return i;
            }
        }
    }
    // 未在主串中找到模式串
    return -1;
}

/** IN at the thought of though OUT 7 **/
int main() {
    // 主串和模式串
    string T, P;
    while(true) {
        // 获取一行
        getline(cin, T);
        getline(cin, P);
        int res = bruteForce(T, P);
        if(res == -1) {
            cout << "主串和模式串不匹配。" << endl;
        } else {
            cout << "模式串在主串的位置为:" << res << endl;
        }
    }
    return 0;
}

算法分析

最坏情况

  • 外层循环:n-m
  • 内层循环:m
  • 总计(n-m)m = O(nm)

最好情况

  • n-m

完全随机的主串和模式串

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

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

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


相关推荐

  • 2021-2027年中国视频监控设备行业市场需求预测与投资战略规划分析报告[通俗易懂]

    2021-2027年中国视频监控设备行业市场需求预测与投资战略规划分析报告[通俗易懂]【报告类型】产业研究【报告价格】4500起【出版时间】即时更新(交付时间约3个工作日)【发布机构】智研瞻产业研究院【报告格式】PDF版本报告介绍了中国视频监控设备行业市场行业相关概述、中国视频监控设备行业市场行业运行环境、分析了中国视频监控设备行业市场行业的现状、中国视频监控设备市场行业竞争格局、对中国视频监控设备行业市场行业做了重点企业经营状况分析及中国视频监控设备行业市场行业发展前景与投资预测。您若想对中国视频监控设备行业市场行业有个系统的了解或者想投资中国视频监控设备行业市场…

    2022年5月28日
    32
  • 有关二维码防封的问题的解决办法

    有关二维码防封的问题的解决办法

    2021年6月30日
    199
  • exe4j的使用_使用方法

    exe4j的使用_使用方法exe4j的使用在这里选择exe填写你的exe名字和存放路径对软件的设置如果电脑是64位需要勾上防止软件乱码-Dfile.encoding=UTF-8导入jar包jdk版本允许最小和

    2022年8月5日
    4
  • Java学习书籍推荐[通俗易懂]

    Java学习书籍推荐[通俗易懂]一、入门  《Java2从入门到精通》-推荐  《ThinkinginJava》-强烈推荐*  O’reilly的Java编程基础系列-参考*  二、进阶  《JavaCookBook》-非常推荐*(包含了Java编程的Tips,适合当做手册来查阅)  《O’reilly-JavaIO》-推荐*(包含JavaIO编程的各个方面)

    2022年6月19日
    28
  • pycharm 2022 激活 host【2021最新】

    (pycharm 2022 激活 host)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html0VOERWDQ5R-eyJsa…

    2022年3月30日
    163
  • 自己动手写游戏:Flappy Bird

    一、关于FlappyBird《FlappyBird》是由来自越南的独立游戏开发者DongNguyen所开发的作品,游戏中玩家必须控制一只小鸟,跨越由各种不同长度水管所组成的障碍,而这只鸟其实是

    2021年12月19日
    39

发表回复

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

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