KMP算法--[hiho1015]
KMP算法,用于实现字符串的匹配
朴素匹配方法的复杂度是O(N*M)
KMP算法复杂度达到了O(N+M)
从这表达式来说,复杂度明显地降低了
核心点
维护next数组 ,对于next数组中next[j] = k
。有需要保证s1串在j-1
位置以及之前的共(k
长度)的子串 和 s1串在k-1
以及之前的部分是相同的(长度取短的部分)。
(假设s1串,比s2串长(或者等于))
代码:
void getNext(int next[]) {int j = 0, k = -1, length = str.size();// 其中k表示的是前面的那个串,而j表示的是后面那个串,用同一个串的不同起始点的串进行比较 // 前面的那个串去匹配后面的那个串,通过这个方式来进行匹配(也是一个KMP) next[0] = -1; // 表示如果开头不能匹配,就用这个前面那个-1来匹配,也就是后移动一位 while(j < length) {if (k == -1 || str[j] == str[k]){j ++; k ++;next[j] = k;} else {k = next[k];}}
}
之后再看hiho1015
和一般的KMP不同,这一题,要求对于匹配出来的串进行计数。
就是看究竟匹配了几次
对于原来的KMP的改的地方就是
if (k == str.size()) {ans += 1;k = next[k];
}
代码如下:
#include <iostream>
using namespace std;string str, ptr;
void getNext(int next[]) {int j = 0, k = -1, length = str.size();// 其中k表示的是前面的那个串,而j表示的是后面那个串,用同一个串的不同起始点的串进行比较 // 前面的那个串去匹配后面的那个串,通过这个方式来进行匹配(也是一个KMP) next[0] = -1; // 表示如果开头不能匹配,就用这个前面那个-1来匹配,也就是后移动一位 while(j < length) {if (k == -1 || str[j] == str[k]){j ++; k ++;next[j] = k;} else {k = next[k];}}
}int KMP_Ans(int next[]) {int j = 0, k = 0, length = ptr.size(), ans = 0;while (j < length) {if (k == -1 || str[k] == ptr[j]) {j ++; k ++;if (k == str.size()) {ans += 1;k = next[k];}} else {k = next[k];}}return ans;
} int main(){int time;cin >> time;while (time--){cin >> str>> ptr;int *a = new int [str.size() + 1];// 将数组开稍微大点 getNext(a);cout << KMP_Ans(a)<< endl;delete[] a; }
}
要是想要刷题可以点这里
原题链接
如果觉得有帮助的话,可以扫码,赞赏鼓励一下!谢谢!
KMP算法--[hiho1015]相关推荐
- BF算法优化-------KMP算法
百度百科:KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特-莫里斯-普拉特操作(简称KMP算法).KMP算法的核心是利用 ...
- 数据结构与算法(5)字符串(BF算法、KMP算法及KMP算法优化)
目录 一.BF算法(暴力算法) 二.KMP算法 三.KMP算法优化 一.BF算法(暴力算法) 一个一个往后匹配,匹配失败继续从母串下一个和头(子串的头)往后继续匹配. 虽然简单,但是需要较多的时间复杂 ...
- hiho 1015 KMP算法 CF 625 B. War of the Corporations
#1015 : KMP算法 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在 ...
- HDU 1711 Number Sequence(KMP算法)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1711 Number Sequence Time Limit: 10000/5000 MS (Java/ ...
- 算法(2)KMP算法
1.0 问题描述 实现KMP算法查找字符串. 2.0 问题分析 "KMP算法"是对字符串查找"简单算法"的优化. 字符串查找"简单算法"是源 ...
- KMP算法求回溯数组的步骤
KMP算法到底是什么原理就不说了,各种资料上讲的明明白白,下面我就如何用代码来实现做一下说明和记录. KMP的核心思想就是,主串不回溯,只模式串回溯.而模式串匹配到第几位时失配,要回溯多少,由模式串本 ...
- 【HDU】2087 剪花布条 (KMP算法的应用)
可以参考:从头彻尾彻底理解KMP 可以用朴素的模式匹配算法,也可以使用KMP算法,KMP算法所用的时间较短 普通版 #include <iostream> #include <str ...
- 字符串的模式匹配 (朴素模式匹配算法 ,KMP算法)
字符串的模式匹配 寻找字符串p在字符串t中首次出现的起始位置 字符串的顺序存储 typedef struct {char str[MAXSIZE];int length; }seqstring; 朴素 ...
- 【每日一算法】KMP算法,看不懂算我输!
微信改版,加星标不迷路! 每日一算法-KMP算法详解 作者:poll的笔记 阅读目录 1 字符串匹配 2 KMP算法 1 字符串匹配 字符串匹配是计算机的基本任务之一. 字符串匹配是什么?举例来说,有 ...
最新文章
- FPGA的设计艺术(17)如何搭建一个简易的逻辑测试平台?
- python编程入门经典教程-2020年5个经典python编程入门视频教程推荐学习
- 算法与数据结构(python):树与二叉树
- APUE(7)---进程环境
- 201671010435-王潇-实验四附加实验-项目互评
- 物联网-移远M26模块MQTT开发(AT命令)
- 【C#编程基础学习笔记】6---变量的命名
- Triumph X发布著名摄影师Kim Joong-man首个NFT系列
- 小程序显示富文本内容(wxparse)
- 太厉害了!推荐几款 Redis 可视化工具
- Microbiome | 黄海所陈松林院士/华科宁康等-肠道菌群在龙利鱼(半滑舌鳎)抗弧菌病性状形成中的机制...
- SQL 筛选某一时间大于某一个值的数据及数量
- 杭州电子科技大学ACM-1094
- writing idiomatic python 读书笔记(5)
- vue 移动端音乐(3) amp;amp;gt;热门歌单推荐部分(webpack-dev-conf.js做后端接口代理+scroll插件)
- STK中心天体cb等相关文件说明
- kaggle 2018 data science bowl____一次失败的 kaggle 项目参与经历及反思总结
- 16世纪的旷世奇才:大学弃医丛数,仅用20年就独立发明了温度计、军事罗盘、天文望远镜,后半生双目失明还能写出惊人科学著作
- ios微信h5棋牌游戏自动播放音效填坑
- 华兴资本获高瓴资本与京东金融等多家机构认购
热门文章
- 解决WINCE6.0新建工程编译出错的问题
- painticon java_新人,关于java的 paintIcon()方法
- 算法分析的目的_掌握这些数学函数,你会在算法效率的分析时经常用到
- linux查看网络流量
- Android下拉刷新开源库对比(转)
- 实现一个可管理、增发、兑换、冻结等高级功能的代币
- 开源助推进NFV发展,红帽为运营商“定制”NFV落地方案
- 深挖BAT内部级别和薪资待遇
- CentOS系统搭建OpenERP
- SQL Server2005如何进行数据库定期备份(转)