Quick Search —— 快速匹配字符串

2023-10-29

注:

      正确性有待考察,因为没有题试试水

转载:

https://blog.csdn.net/superhackerzhang/article/details/6432559

 

算法说明:

令模式串为p={p[0],p[1],...,p[m-1]},长度为m。文本串为T={T[0],T[1],...,T[n-1]},长度为n.要求n>=m.

令k为p在T上的对齐位置,即p[0]与T[k],p[1]与T[k+1],.....,p[m-1]与T[k+m-1]相对应,检测在位置k是否匹配时只要逐个检查以上相对应的字符即可。当在某个位置发生失配时,根据T[k+m]来决定模式串向右移动的位置,因为一旦发生失配,模式串至少向右移动一位,因此T[k+m]必然要和模式串中相同字符的最右端出现相对应,否则会发生另一次失配。如果模式串中无T[k+m]字符,则将模式串向右移动m+1个位置。而在检查P与T的字符是否匹配时可以使用任意的顺序,而不必从左至右或从右至左,这是与KMP或BM最大的区别。

 

 

以下代码计算模式串的出现过的字母所在的位置,即p[m-1]的字母位置记为1,p[m-2]记为2,如果一个字母在模式串中出现多次,则记录最右边的出现位置。

 

map<char,int>pos;
void pre(string p,map<char,int>&pos)
{
    for(int i=p.size()-1; i>=0; i--)
    {
        if(pos.find(p[i])==pos.end())
            pos.insert(pair<char,int>(p[i],p.size()-i));
    }
}

Quick Search 主体函数    ——  连续输出模板串在文本里的位置

void QS(string p,string text,map<char,int>pos)
{
    int k=0,m=p.size(),l=text.size();
    bool flag=false;
    while(k+m<=l)
    {
        int j=0;
        for(; j<m; j++)
        {
            if(p[j]!=text[j+k])
            {
                if(k+m>=l)
                {
                    if(!flag)
                        cout<<0;
                    return;
                }
                if(pos.find(text[k+m])!=pos.end())
                    k+=pos[text[k+m]];
                else
                    k=k+m+1;              //失配后模板串至少向右移动一位
                break;
            }
        }
        if(j==m)         //输出模板串出现在文本里的位置
        {
            cout<<k+1<<" ";
            flag=true;
            k++;
        }
    }
    if(!flag)
        cout<<0;
    return;
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Quick Search —— 快速匹配字符串 的相关文章

  • 你不知道的JavaScript---------- 行为委托

    目录 Prototype 机制 面向委托的设计 类理论 委托理论 比较思维模型 JavaScript创建UI控件 控件创建渲染 ES5类继承形式 控件 类 类形式 委托控件对象 委托形式 更简洁的设计 更好的语法 内省 Prototype
  • C++ 条件编译指令和defined 操作符

    使用条件条件编译指令 可以限制程序中的某些内容要在满足一定条件下才参与编译 因此 可以利用条件编译指令使同一个源程序在不同的编译环境下产生不同的目标代码 在头文件中使用 ifdef和 ifndef是非常重要的 可以防止双重定义错误的出现 常
  • centos8安装docker

    执行yum install docker ce会报错Problem package docker ce 3 19 03 3 3 el7 x86 64 requires containerd io gt 1 2 2 3 but none of
  • Android中RecyclerView分页加载数据

    Android中RecyclerView分页加载数据 在Android开发中 RecyclerView是一个强大的视图容器 常用于展示大量数据 当数据量很大时 一次性加载所有数据可能会导致用户等待时间过长或者内存不足的问题 为了解决这个问题
  • 第十一届蓝桥杯 b组

    答案 3880 代码 package 第十一届蓝桥杯 public class Main01 public static void main String args int t 10000 int time 0 boolean b true
  • [深入浅出Cocoa]iOS网络编程之Socket

    深入浅出Cocoa iOS网络编程之Socket 罗朝辉 http blog csdn net kesalin CC 许可 转载请注明出处 更多 Cocoa 开发文章 敬请访问 深入浅出Cocoa CSDN专栏 http blog csdn
  • 表单+初部认识css

    表单
  • python找零钱程序-Python实现的一个找零钱的小程序代码分享

    Python写的一个按面值找零钱的程序 按照我们正常的思维逻辑从大面值到小面值的找零方法 人民币面值有100元 50元 20元 10元 5元 1元 5角 1角 而程序也相应的设置了这些面值 只需要调用函数时传入您想要找零的金额 程序会自动算
  • 本地项目HTTP,加载静态资源却是HTTPS的问题【已解决】

    本地项目HTTP 加载静态资源却是HTTPS的问题 已解决 参考文章 1 本地项目HTTP 加载静态资源却是HTTPS的问题 已解决 2 https www cnblogs com a record p 9067060 html 备忘一下
  • linux桌面卡死解决办法

    切换回命令行 ctl alt f1 重启桌面 sudo service lightdm restart 切换回桌面 ctl alt f
  • Excel 2016图表标题不能输入中文,图表一直闪动

    问题 最近使用excel2016 发现插入图表后 图表一直闪 无法更改标题或者其它操作 如下图所示 解决 依次选择 文件 gt 选项 gt 加载项
  • diff和patch的使用简介

    diff的使用 我们先help看下diff的介绍 Usage diff OPTION FILES Compare FILES line by line Mandatory arguments to long options are mand
  • ContentProvider原理分析

    转载请注明出处 http blog csdn net a992036795 article details 51612425 一 ContentProvider的介绍 关于ContentProvider的介绍 以及使用可以参考我的上一篇博客
  • uni-app基本入门

    目录 1 uni app介绍 2 uni app特点 3 uni app使用方法 3 1安装uni app 可以使用npm安装uni app 也可以直接下载uni app的源代码 3 2创建uni app项目 可以使用HBuilderX等I
  • 【githubshare】开源技术C/C++ 程序设计

    GitHub 上一个开源的 Notion 替代品 AppFlowy IO 完成了个人笔记 知识库 任务管理的功能结合 除了具备 Notion 的基础核心功能外 该项目还支持自托管与离线模式 数据与安全性可控 开发者可任意定制项目模板 插件
  • uni-app多选select组件,兼容多平台小程序、H5

    目录 介绍 平台差异说明 使用方式 安装 引入 基本使用 默认选中项 回显 配置label value对应的key名称 获取点击确认后的结果 完整示例 API Props Option Attributes Slot Events 介绍 多
  • React Router 5.1.0使用useHistory做页面跳转导航

    从React Router v5 1 0开始 新增了useHistory钩子 hook 如果是使用React gt 16 8 0 编写以下函数组件 使用useHistory即可实现编程时页面跳转导航 示例 import useHistory

随机推荐

  • RMQ——支持合并和优先级的消息队列

    业务背景 在某个项目中需要实现一个功能 商品价格发生变化时将商品价格打印在商品主图上面 那么需要在价格发生变动的时候触发合成一张带价格的图片 每一次触发合图时计算价格都是获取当前最新的价格 上游价格变化的因素很多 变化很频繁 下游合图消耗G
  • E-R图转换成关系模式 两个例题 以及ea 画 E-R图过程

    1 画er图 新建项目 注 网上查不到具体建立过程方法 目测是对的 矩形 实体 椭圆 属性 菱形 方法 属性为主码设置 2 两道例题 1 现有论文和作者两个实体 论文实体的属性包括题目 期刊名称 年份 期刊号 作者实体的属性包括姓名 单位
  • 启动SpringBoot后target没有yaml配置文件导致的Bug

    Bug复现 nested exception is org springframework boot autoconfigure jdbc DataSourceProperties DataSourceBeanCreationExcepti
  • JAVA--Collections类

    Collections类概述 Collection接口的实现类 如ArrayList LinkedList本身并没有提供排序 倒置 查找等方法这些方法是由Collections类来实现的 该类有很多public static方法 可以直接对
  • mysql 查询同一个字段同时符合多个不同条件的数据

    使用GROUP BY 去重 使用 HAVING sum gt 2 判断查询出来的数据超过同一字段的查询条件数量 取到同时符合条件的数据 SELECT c FROM goods a INNER JOIN goods category rela
  • 蚂蚁森林快捷指令_iPhone 这样偷蚂蚁森林能量,简直就是开挂

    我发现身边有很大一群人 早上要定两个闹钟 一个是偷能量的 另一个是起床的 而常规的偷能量操作无非是 关闹钟 手动打开支付宝 手动进入蚂蚁森林 但这还是略麻烦 很多人在想 速度能不能再快点 不然我的能量要被偷光了 话说我种完一棵树就弃坑了答案
  • 为什么单线程的Redis能这么快?

    1 为什么是单线程 总结 Redis 的普通 KV 存储瓶颈不在 CPU 而往往可能受到内存和网络 I O 的制约 Redis 中有多种类型的数据操作 甚至包括一些事务处理 如果采用多线程 则会被多线程产生的切换问题而困扰 也可能因为加锁导
  • 算法题---合并两个有序数组(乐乐独记)

    1 题意描述 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2 另有两个整数 m 和 n 分别表示 nums1 和 nums2 中的元素数目 请你合并 nums2 到 nums1 中 使合并后的数组同样按 非递减顺序 排列
  • 用AD组策略------控制客户端本地组

    从安全的角度来说是不建议大家把域用户加入到本地Power Users 写这篇文章的目的是告诉大家 可以通过组策略把域用户和域组自动加入到客户端的本地组 实现对客户端本地组的控制 如果善用此策略可以增加系统的安全性 本地Administrat
  • wkwebview 文件服务器,WKWebView 的缓存策略

    缓存策略有以下四种方式 默认的NSURLRequest 缓存策略 后台需要做响应头设置 否则无法进行缓存 存在cache目录 n磁盘紧张会被清除 NSURLCache 和上面类似 可以不需要后台设置也能存储 存在cache目录 n磁盘紧张会
  • Ubuntu建立nfs和tftp环境

    nfs apt安装 sudo apt get install nfs kernel server 编辑配置文件 sudo vi etc exports 在文件末尾加入红框所示内容 其中蓝框内写入nfs工作目录 要传输的文件放在这个目录下 开
  • MATLAB入门教程

    1 MATLAB的基本知识 1 1 基本运算与函数 在MATLAB下进行基本数学运算 只需将运算式直接打入提示号 gt gt 之後 并按入Enter键即可 例如 gt gt 5 2 1 3 0 8 10 25 ans 4 2000 MATL
  • 算法学习——递归

    引言 从这个专栏开始 我们将会一起来学习算法知识 首先我们要一起来学习的算法便是递归 为什么呢 因为这个算法是我很难理解的算法 我希望通过写这些算法博客 来加深自己对于递归算法的理解和运用 当然 学习算法最快的方式便是通过刷题 但是今天这篇
  • jwt 的 token 被获取怎么办

    jwt 签发后 每次请求会续期 如果 token 被抓包后 别人得到后 有没有好的方案解决身份窃取问抗投诉服务器题 签发 token 的时候加入一些验证信息 比如 IP 如果当前 request IP 和签发时候的 IP 不一致就加 bla
  • 1.Python 基本概念

    一 Python 源程序的基本概念 Python源程序就是一个特殊格式的文本文件 可以使用任意文本编辑软件做Python的开发 Python程序的文件扩展名 通常是 py 文件 二 Python 2 x 与 Python 3 x 版本介绍
  • 多线程算法(完整版)

    多线程算法 完整版 算法导论第3版新增第27章 ThomasH Cormen Charles E Leiserson Ronald L Rivest Clifford Stein 邓辉 译 原文 http software intel co
  • 排序(Sort)

    排序 1 排序的基本知识 2 插入类排序 2 1 直接插入排序 2 2 折半插入排序 2 3 希尔排序 3 交换类排序 3 1 冒泡排序 3 2 快速排序 4 选择类排序 4 1 简单选择排序 4 2 堆排序 5 归并排序 6 基数排序 7
  • 基于python开发一个Django博客网站项目

    基于Python和Django框架的简单博客平台 该平台提供了一个用户友好的界面 使用户能够轻松地创建和管理博客文章 评论和标签 前期环境 需要准备的环境 python3以上 创建一个虚拟环境 以兼容不同的Django版本 创建一个文件夹来
  • 图像频谱图-直方图三维可视化 python

    图像频谱图 直方图三维可视化 python代码 目录 1 条纹噪声图像 频谱图3D可视化 2 图像二维直方图3D可视化 1 条纹噪声图像 频谱图3D可视化 频谱图三维可视化思路 将图像经过傅里叶变换 中心化 取log 再3D可视化 代码 i
  • Quick Search —— 快速匹配字符串

    注 正确性有待考察 因为没有题试试水 转载 https blog csdn net superhackerzhang article details 6432559 算法说明 令模式串为p p 0 p 1 p m 1 长度为m 文本串为T