数据结构:KMP算法

2023-10-31

给定一个字符串 S,以及一个模式串 P,所有字符串中只包含大小写英文字母以及阿拉伯数字。

模式串 P 在字符串 S 中多次作为子串出现。

求出模式串 P 在字符串 S 中所有出现的位置的起始下标。

/*
  KMP算法
  数组下标从1开始
  额外next数组,空间换时间
  时间复杂度从暴力算法O(n*m) 到 KMP算法O(m+n) = O(m)
  
  模拟:
        ababababc
        ababc
*/

#include <iostream>
using namespace std;

const int N = 1e5 + 10, M = 1e6 + 10;

int n, m;
char p[N], s[M]; // p为模式串,s为子串

int ne[N]; // next数组:最长相等的前后缀,不包括整个到下标为j的数组本身

// 题目求:模式串 P 在字符串 S 中所有出现的位置的起始下标。
int main() {
    // +1代表下标从1开始的写法
    // n:模式串的长度
    // m:字符串的长度
    cin >> n >> p + 1 >> m >> s + 1;

    // 求模式串p的next数组
    // 在下标从1开始的写法中,找不到相等的前后缀,就令ne[i]=0;
    ne[1] = 0;
    for (int i = 2, j = 0; i <= n; i++) 
    {
        while (j && p[i] != p[j + 1]) j = ne[j];
        if (p[i] == p[j + 1])  j++;   
        ne[i] = j;
    }

    // 寻找s中的模式串p
    // 每个匹配过程为:p的下一个字符(j+1)与s当前的字符(i) 比较
    for (int i = 1, j = 0; i <= m; i++) 
    {
        while (j && s[i] != p[j + 1]) j = ne[j];
        
        if (s[i] == p[j + 1])  j++;
            
        if (j == n) {
            cout << i - n << " "; // 下标如果从1开始数就为i-n+1
            j = ne[j];
        }
    }

    return 0;
}

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

数据结构:KMP算法 的相关文章

  • 模板类包装任意类型/非类型模板类

    假设我有一个模板类base和一个班级wrapper其中包含一个实例化成员base 我想定义班级wrapper这样它依赖于模板参数包 该参数包只是 传递 给实例化成员base 例如 考虑下面的代码 它工作得很好 include
  • 如何自定义 DataTable 列的排序

    我需要对数据表列的值进行排序 该列包含字符串 整数或混合文本 例如 数据表列包含如下值 23 18 12 store 23 store a1 1283 25 如果我使用对值进行排序Dataview sort 方法会按此顺序产生 12 128
  • 如何调试参数化 SQL 查询

    我使用 C 连接到数据库 然后使用 Ad hoc SQL 来获取数据 这个简单的 SQL 查询非常方便调试 因为我可以记录 SQL 查询字符串 如果我使用参数化 SQL 查询命令 有没有办法记录 sql 查询字符串以进行调试 我想就是这样的
  • 将 2D 数组映射到 1D 数组

    我想用一维数组来表示一个二维数组 函数将传递两个索引 x y 和要存储的值 这两个索引代表一维数组的单个元素 并相应地设置它 我知道一维数组需要具有 arrayWidth arrayHeight 的大小 但我不知道如何设置每个元素 例如 如
  • 测试 hdf5/c++ 中的组是否存在

    我正在打开一个现有的 HDF5 文件来附加数据 我想向那个叫做的小组保证 A存在以供后续访问 我正在寻找一种简单的方法来创建 A有条件地 如果不存在则创建并返回新组 或者返回现有组 一种方法是测试 A存在 我怎样才能高效地做到这一点 根据
  • 如何在 C# 事件中区分更改是由代码还是由用户进行?

    我有一个简单的TextBox一开始是空的 我有一个简单的事件 TextChanged 可以知道用户何时更改了其中的任何内容TextBox 但是 如果我自己在代码中对其执行任何操作 该事件就会触发 喜欢设置textbox Text Test
  • 实体框架代码优先 - 在另一个文件中配置

    使用 Fluent API 将表到实体的映射分开的最佳方法是什么 以便它全部位于单独的类中 而不是内联在 OnModelCreating 方法中 我目前在做什么 public class FooContext DbContext prote
  • 有没有比这更快的方法来查找目录和所有子目录中的所有文件?

    我正在编写一个程序 需要在目录及其所有子目录中搜索具有特定扩展名的文件 这将在本地驱动器和网络驱动器上使用 因此性能是一个问题 这是我现在使用的递归方法 private void GetFileList string fileSearchP
  • 控制台应用程序 .net Core 2.0 的配置

    在 net Core 1 中我们可以这样做 IConfiguration config new ConfigurationBuilder AddJsonFile appsettings json true true Build 这样就可以使
  • glDrawElements 只绘制半个四边形

    这是我的功能 void Object draw2 if mIsInitialised return Tell OpenGL about our vertex and normal data glEnableClientState GL VE
  • 成员初始值设定项列表中的求值顺序是什么?

    我有一个带有一些参数的构造函数 我假设它们是按照列出的顺序初始化的 但在一种情况下 它们似乎是按相反的顺序初始化的 导致中止 当我反转参数时 程序停止中止 下面是我正在使用的语法的示例 a 之前需要初始化b 在这种情况下 你能保证这个初始化
  • 如何检测斑点并将其裁剪成 png 文件?

    我一直在开发一个网络应用程序 我陷入了一个有问题的问题 我会尝试解释我想要做什么 在这里您看到第一个大图像 其中有绿色形状 我想要做的是将这些形状裁剪成不同的 png 文件 并使它们的背景透明 就像大图像下面的示例裁剪图像一样 第一张图像将
  • CMake - 将预构建库链接到 C# 项目

    我正在使用 CMake 构建 C 库 该库依赖于已构建的库 dll 我似乎无法让图书馆链接到我的图书馆 我尝试过使用target link libraries mylib external lib 我也尝试过暴力破解 reference e
  • 推送 Lua 表

    我已经创建了一个Lua表C 但我不知道如何将该表推入堆栈顶部 以便我可以将其传递给 Lua 函数 有谁知道如何做到这一点 这是我当前的代码 lua createtable state libraries size 0 int table i
  • 当格式字符串包含“{”时,String.Format 异常

    我正在使用 VSTS 2008 C Net 2 0 执行以下语句时 String Format 语句抛出 FormatException 有什么想法是错误的吗 这是获取我正在使用的 template html 的位置 我想在 templat
  • C++ Primer 5th Edition 错误 bool 值没有指定最小大小?

    bool 的最小大小不应该是 1 个字节吗 这有点学术性的东西 尽管它们会转换为数字 并且 与其他所有事物一样 它们最终将基本上由计算机内存中的数字表示 但布尔值不是数字 你的bool可以取值true 或值false 即使您确实需要至少 1
  • 为什么 C 函数不能返回数组类型?

    我是 C 语言新手 想知道 为什么 C 函数不能返回数组类型 我知道数组名是数组第一个值的地址 而数组是 C 中的二等公民 您自己已经回答了这个问题 数组是二等公民 C 按值返回 数组不能按值传递 因此不能返回它们 至于为什么数组不能按值传
  • 如何使用 g++ 在 c++ 20 中使用模块?

    我读了这个链接https gcc gnu org wiki cxx modules https gcc gnu org wiki cxx modules并尝试从该网站复制以下示例 我已经知道这个编译器部分支持模块系统 注 我用的是windo
  • 有没有办法让 VS2010 在我的方法中扩展或收缩 try 块?

    我的代码有很多 try catch finally 块 与我在 VS2010 中的方法不同 除了添加区域之外 我无法在开发时扩展或收缩这些区域来隐藏内容 try vm R vm Qu vm T vm D vm Fil vm Type vm
  • 最后从同一类中的其他构造函数调用构造函数

    我在这里读到可以调用另一个构造函数从同一类中的另一个构造函数调用构造函数 https stackoverflow com questions 829870 calling constructor from other constructor

随机推荐

  • 【工号不够用了怎么办?】

    题目描述 工号不够用了怎么办 3020年 空间通信集团的员工人数突破20亿人 即将遇到现有工号不够用的窘境 现在 请你负责调研新工号系统 继承历史传统 新的工号系统由小写英文字母 a z 和数字 0 9 两部分构成 新工号由一段英文字母开头
  • 会话状态保持,JSESSIONID,COOKIE,URL重写

    居然有3W的访问量 好 我就把session和cookie的关系先来个总结 注意 是最最简单直白明了的总结了 http协议 协议 协议 重要的说3遍 http协议主要有2大块 请求头和请求体 cookie在http请求头里 就是一个由多个K
  • webpack的基本的配置和应用

    借用下官网的图 从图中我们了解webpack功能就是把带有依赖的模块打包成单一相同类别的静态资源文件 接下来帮大家分析下webpack的核心概念及一些辅助配置 一 核心概念 webpack核心概念有这些 入口 entry 输出 output
  • VMware vCenter Server 证书过期解决

    问题现象 今天一上班同事反应虚拟平台登录不了了 验证功能正常 输入正确密码后跳转如下错误界面 查看证书可以看见证书今天要过期了 但是当时还没到11 53 13 却已经用不了了 原因 从vCenter 6 5 Update2 GA Date
  • 数据结构图在python中的应用

    程序世界里 有很多的数据结构 比如 堆 栈 链表等等 今天要讲的就是图数据结构啦 相信大家都使用过或者听说过图数据库吧 我们就来看看最简单的图数据结构算法 首先先来看一下图长什么样 从上图能看出 比如节点A可以到达C D B 节点B只能到达
  • 阶乘和数(python3)

    问题描述 一个正整数如果等于组成它的各位数字的阶乘之和 则该正整数称为阶乘和数 例如正整数145 1 4 5 等于145 因此145就是一个阶乘和数 输入一个正整数 计算它的各位数字的阶乘之和 并判断它是否是一个阶乘和数 注意 输入的正整数
  • [Git系列] Git 基本概念

    版本控制系统 版本控制系统是一种帮助软件开发者实现团队合作和历史版本维护的软件 一个版本控制系统应具备以下列出的这几个基本功能 允许开发者并发工作 不允许一个开发者覆写另一个开发者的修改 保存所有版本历史 版本控制系统可以分为如下两类 集中
  • Python解析JSON数据的方法

    Python解析JSON数据的方法 在Python中 我们可以使用内置的json模块来解析JSON数据 下面是一个简单的例子 import json JSON数据 json str name Alice age 25 is student
  • Linux命令:top

    top命令 用于动态地监视进程活动与系统负载等信息 top 23 27 36 up 30 min 0 users load average 0 52 0 58 0 59 Tasks 6 total 1 running 5 sleeping
  • 如何使用anaconda创建环境

    使用anaconda创建环境 方法一 直接从ANACONDA NAVIGATOR里面创建 不建议 但是这种不太好 这种创建的环境 最后很难在命令指示符上成功安装库 所以不建议 本人踩了很多次雷才发现的 方法二 从Anaconda Promp
  • weston 简介

    参考 weston wiki Weston Gentoo Wiki weston 1 Linux man pages code tools Weston 1 12 0 非常详尽 多图慎入 Wayland与Weston简介 云 社区 腾讯云
  • 根据pid查端口_PID控制的原理及常用口诀总结

    PID控制器 比例 积分 微分控制器 是一个在工业控制应用中常见的反馈回路部件 由比例单元比例P proportion 积分单元I integration 和微分单元D differentiation 组成 PID控制器作为最早实用化的控制
  • [小技巧] git 取得两个 tag 之间的 commit

    参考 http stackoverflow com questions 5863426 get commit list between tags in git git log pretty oneline tagA tagB If you
  • JS逆向——百度翻译

    我们在爬虫时经常会遇到一些奇怪的参数 比如百度翻译的sign 网易云音乐的params等 这个时候就要用js逆向的技术来获取参数的构造方法 前置准备 Chorme浏览器 Sublime编译器 Python 爬取链接 https fanyi
  • matlab 代码转 Python

    可以使用 MATLAB 工具箱 MATLAB 集成工具 将 MATLAB 代码转换为 Python 代码 这个工具箱可以自动将大部分 MATLAB 代码转换为类似的 Python 代码 并且可以自动处理一些类型和语法上的差异 在 MATLA
  • nrf52832通过i2c官方库nrf_drv_twi读取tmp117温度

    twi调试过程如下 1 代码实现 分别实现对nrf drv twi init nrf drv twi rx nrf drv twi tx相关官方库的调用 2 修改工程配置文件sdk config h 增加TWI的相关配置 参考 nRF5 S
  • WSL2安装google chrome浏览器

    一 环境 Windows 11 Ubuntu 22 04 二 安装google chrome步骤 官方文档 1 创建文件夹 mkdir chrome 2 进入目录 cd chrome 3 下载chrome压缩包 sudo wget http
  • 计量经济学及Stata应用 5.12 多元回归的Stata实例

    1 多元回归 regress y x1 x2 x3 reg y x1 x2 x3 2 解释定义 1 右上角 Number of obs 样本容量N F n N F统计量 自由度为k 约束条件 m N K 检验整个方程的联合显著性 Prob
  • C++的new和delete

    一 new和delete 1 在C 中堆内存的分配和释放是通过new和delete 来操作的 他们和C语言的malloc和free有什么区别呢 new的底层也是通过malloc来开辟内存的 new比malloc 多一项功能 就是开辟完内存
  • 数据结构:KMP算法

    给定一个字符串 S 以及一个模式串 P 所有字符串中只包含大小写英文字母以及阿拉伯数字 模式串 P 在字符串 S 中多次作为子串出现 求出模式串 P 在字符串 S 中所有出现的位置的起始下标 KMP算法 数组下标从1开始 额外next数组