KMP总结
首先给一个我能看懂的KMP讲解:
http://blog.csdn.net/v_july_v/article/details/7041827 来自大神july
文章很长,但是慢慢看,会发现讲的很好。
首先有两种KMP的写法:
第一种:
void getNext()
{
int i=;
int j=-;
nexts[]=-;
while(i<m)
{
if(j==-||num2[i]==num2[j])
{
i++;
j++;
nexts[i]=j;
}
else
j=nexts[j];
}
return;
}
int Kmp()
{
int i=;
int k=;
while(i<n&&k<m)
{
if(k==-||num1[i]==num2[k])
{
i++;
k++;
}
else
k=nexts[k];
if(k==m)
return i-m+;
}
/* if(i<n)
return i-m+1;
else*/
return -;
}
第二种:
void getNext()
{
int i=;
int j=-;
nexts[]=-;
while(i<m)
{
if(j==-||s2[i]==s2[j])
{
i++;
j++;
nexts[i]=j;
}
else
j=nexts[j];
}
return;
}
int Kmp()
{
int i=;
int k=;
int cnt=;
for(int i=;i<n;i++)
{
while(k&&s1[i]!=s2[k])
k=nexts[k];
if(s1[i]==s2[k])
k++;
if(k==m)
cnt++;
}
return cnt;
}
这两种写法用于不同的地方。
题目总结:
1.求匹配串在文本串出现的次数
直接利用第二种写法即可。
题目:HDU - 1686
2.求匹配串在文本串第一次匹配成功时的起始位置。
套用第一种写法即可。
题目:HDU - 1711
3.给定一个字符串,问我们还需要添加几个字符可以构成一个由n个循环节组成的字符串。
利用Next数组的性质,
- 假设字符串的长度为len,那么最小的循环节就是cir = len-next[len] ;
- 如果有len%cir == 0,那么这个字符串就是已经是完美的字符串,不用添加任何字符;
- 如果不是完美的那么需要添加的字符数就是cir - (len-(len/cir)*cir)),相当与需要在最后一个循环节上面添加几个。
题目:HDU - 3746
4.给你一个字符串 s 求出所有满足s[i] == s[i+p] ( 0 < i+p < len )的 p ;
来自于其他人的做饭:
•知识点:KMP算法、对next数组的理解
KMP总结的更多相关文章
- KMP算法求解
// KMP.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> using namespac ...
- 简单有效的kmp算法
以前看过kmp算法,当时接触后总感觉好深奥啊,抱着数据结构的数啃了一中午,最终才大致看懂,后来提起kmp也只剩下“奥,它是做模式匹配的”这点干货.最近有空,翻出来算法导论看看,原来就是这么简单(先不说 ...
- KMP算法
KMP算法是字符串模式匹配当中最经典的算法,原来大二学数据结构的有讲,但是当时只是记住了原理,但不知道代码实现,今天终于是完成了KMP的代码实现.原理KMP的原理其实很简单,给定一个字符串和一个模式串 ...
- 萌新笔记——用KMP算法与Trie字典树实现屏蔽敏感词(UTF-8编码)
前几天写好了字典,又刚好重温了KMP算法,恰逢遇到朋友吐槽最近被和谐的词越来越多了,于是突发奇想,想要自己实现一下敏感词屏蔽. 基本敏感词的屏蔽说起来很简单,只要把字符串中的敏感词替换成"* ...
- [KMP]【学习笔记】
Oulipo Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 36916 Accepted: 14904 Descript ...
- KMP算法实现
链接:http://blog.csdn.net/joylnwang/article/details/6778316 KMP算法是一种很经典的字符串匹配算法,链接中的讲解已经是很明确得了,自己按照其讲解 ...
- KMP专题
1.[HDU 3336]Count the string(KMP+dp) 题意:求给定字符串含前缀的数量,如输入字符串abab,前缀是a.ab.aba.abab,在原字符串中出现的次数分别是2.2.1 ...
- KMP学习之旅
说起kmp就要从字符串的匹配说起,下面我们谈谈字符串的匹配 给定一个原字符串:bababababababababb,再给定一个模式串:bababb,求模式串是否在源字符串中出现 最简单的方法就是遍历源 ...
- KMP模板
参考:http://www.cnblogs.com/c-cloud/p/3224788.html #include<stdio.h> #include<string.h> vo ...
- 【字符串匹配】KMP算法和next数组的c/c++实现
KMP算法基本思想有许多博客都写到了,写得也十分形象,不懂得可以参考下面的传送门,我就不解释基本思想了.本文主要给出KMP算法及next数组的计算方法(主要是很多网上的代码本人(相信应该是许多人吧)看 ...
随机推荐
- Windows命令行设置dns
管理员运行cmd 1.dns配置成192.168.1.200 netsh interface ip set dns name="以太网" source=static addr=19 ...
- JavaScript字符串相关
嘛,开头来个定义好了! 首先它是JavaScript基本数据类型之一.字符串由零或多个16位Unicode字符组成的字符序列,用''或者""表示. 它有一些转义序列,例如\n ...
- pandas(一)
import numpy as py import pandas as pd Series对象 data= pd.Series([0.25,0.5,0.75,1.0]) 默认索引是数字 data= ...
- Win10 +gtx1660 +CUDA10.0+CNDNN7.5+Tensorflow 1.13.1
硬件环境:ASUS Z370 + i7 8700K + 16G + GTX1660 软件环境:win10 x64 anaconda 3.5 python 3.6 pycharm 201 ...
- 线程等待(java)
定义一个对象: private Object objWaiter = new Object(); 在需要等待的地方加等待锁: synchronized (objWaiter) { objWaiter. ...
- 利用dladdr来获得so自身的路径
#include <dlfcn.h> //定义该函数为了dladdr获取符号信息 void fun1() { } Dl_info info; //dladdr获取某个地址的符号信息 int ...
- Python 多线程和线程池
一,前言 进程:是程序,资源集合,进程控制块组成,是最小的资源单位 特点:就对Python而言,可以实现真正的并行效果 缺点:进程切换很容易消耗cpu资源,进程之间的通信相对线程来说比较麻烦 线程:是 ...
- 再一波Python实战项目列表
前言: 近几年Python可谓是大热啊,很多人都纷纷投入Python的学习中,以前我们实验楼总结过多篇Python实战项目列表,不但有用还有趣,最主要的是咱们实验楼不但有详细的开发教程,更有在线开发环 ...
- JMeter-正则表达式(HTML)
2019-04-26问题:需要取出交易成功,但是有黄色部分 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN& ...
- Mac对gdb签名
codesign -f -s gdb-cert $(which gdb) gdb_cert为自己创建的证书名 添加证书信任 activity-monitor双击taskgated 关闭 gdb成功运行