当前位置: 首页 > news >正文

C++ KMP字符串 ||暴力算法 和 KMP算法模板题解法

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

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

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

输入格式
第一行输入整数 N
,表示字符串 P
的长度。

第二行输入字符串 P

第三行输入整数 M
,表示字符串 S
的长度。

第四行输入字符串 S

输出格式
共一行,输出所有出现位置的起始下标(下标从 0
开始计数),整数之间用空格隔开。

数据范围
1≤N≤105

1≤M≤106
输入样例:
3
aba
5
ababa
输出样例:
0 2

分析:首先串长很大,暴力写的话很简单但是会TLE,可以用KMP算法优化,这里记录一下KMP算法的应用和一个KMP的模版。

首先给出暴力的算法:

#include <iostream>using namespace std;const int N = 100010;int n, m;
char p[N], s[N];int main ()
{cin>>n>>p>>m>>s;for(int i = 0; i < m; i ++ ) //s{bool mark = true;if(i + n > m) break;for(int j = 0; j < n; j ++ ){if(s[i+j] != p[j]){mark = false;break;}}if(mark) printf("%d ", i);}return 0;}

KMP正确写法:

#include <iostream>using namespace std;const int N = 10010, M = 100010;int n, m;
char p[N], s[M];
int ne[N]; //记录的是int main ()
{cin>>n>>p + 1>>m>>s + 1; //串的输入从下标1 开始//求ne数组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;}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){printf("%d ", i - n);j = ne[j];}}return 0;}

相关文章:

  • 作业三详解
  • STM32 ESP8266 物联网智能温室大棚 (附源码 PCB 原理图 设计文档)
  • MR实战:词频统计
  • git本地创建分支并推送到远程关联起来
  • LLM之RAG实战(十三)| 利用MongoDB矢量搜索实现RAG高级检索
  • 【Unity嵌入Android原生工程】
  • java基础之Java8新特性-Stream(流)
  • 弹窗里el-cascader下拉框脱离文档流的解决办法
  • BLE Mesh蓝牙组网技术详细解析之Model Layer模型层(八)
  • MySQL-数据库概述
  • HTML----JavaScript操作对象BOM对象
  • how2heap-2.23-09-chunk_extend_and_overlapping
  • ReactNative 常见问题及处理办法(加固混淆)
  • AI原生应用开发“三板斧”亮相WAVE SUMMIT+2023
  • 由浅入深理解C#中的事件
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • 【Leetcode】104. 二叉树的最大深度
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • css系列之关于字体的事
  • Git 使用集
  • HTTP中的ETag在移动客户端的应用
  • iOS小技巧之UIImagePickerController实现头像选择
  • mac修复ab及siege安装
  • php的插入排序,通过双层for循环
  • puppeteer stop redirect 的正确姿势及 net::ERR_FAILED 的解决
  • python docx文档转html页面
  • Quartz实现数据同步 | 从0开始构建SpringCloud微服务(3)
  • React-Native - 收藏集 - 掘金
  • springMvc学习笔记(2)
  • Vue实战(四)登录/注册页的实现
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 前端存储 - localStorage
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • 算法之不定期更新(一)(2018-04-12)
  • 远离DoS攻击 Windows Server 2016发布DNS政策
  • 再谈express与koa的对比
  • Java总结 - String - 这篇请使劲喷我
  • #Linux(帮助手册)
  • (4)logging(日志模块)
  • (Java数据结构)ArrayList
  • (第二周)效能测试
  • (附源码)流浪动物保护平台的设计与实现 毕业设计 161154
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • (轉貼) 資訊相關科系畢業的學生,未來會是什麼樣子?(Misc)
  • .aanva
  • .NET Core日志内容详解,详解不同日志级别的区别和有关日志记录的实用工具和第三方库详解与示例
  • .NET版Word处理控件Aspose.words功能演示:在ASP.NET MVC中创建MS Word编辑器
  • .NET企业级应用架构设计系列之技术选型
  • @column注解_MyBatis注解开发 -MyBatis(15)
  • @Transactional类内部访问失效原因详解
  • [ 常用工具篇 ] POC-bomber 漏洞检测工具安装及使用详解
  • [AI]文心一言出圈的同时,NLP处理下的ChatGPT-4.5最新资讯
  • [Android Pro] listView和GridView的item设置的高度和宽度不起作用