KMP模板与讲解
读书笔记终于写完了,写一下我对KMP的理解。
KMP的思想就是尽量利用已经得到的信息,来降低时间复杂度,已经得到的信息存放在next数组里。算法确实很难理解,所以很难讲解。。举个例子来说吧。
设字符串是str[],next[5] = 2。
就表示str[5]前面的2个字符,与str[2]前面的2个字符相同,也就是str[0] == str[3], str[1] == str[4],这样把str[2]平移到str[5]的位置以后,就能保证前面的已经匹配了。就是下图:
目标串 ..........a b c.........
str[] a b c a b d e f
下标 0 1 2 3 4 5 6 7
这时候在下标为5的位置,d和c是不匹配的,因为next[5] = 2,所以把下标为2的c平移到下标为5的位置,再次比较。
目标串 ..........a b c.........
str[] a b c a b d e f
下标 0 1 2 3 4 5 6 7
当下标超出待匹配的字符串的长度时,就说明在目标串中找到了该字串。
这里还有一个定理:next数组中的值就是"前缀"和"后缀"的最长的共有元素的长度。
还有一句“名言”:假如你要向你喜欢的人表白的话,我的名字是你的告白语中的子串吗?
最后是几篇比较好的讲解KMP的文章,讲解方式各不相同,但是都讲得特别好。
http://www.matrix67.com/blog/archives/115
http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html
http://blog.csdn.net/v_july_v/article/details/7041827
void kmp(char target[], char source[])
{
int n = strlen(target);
int m = strlen(source);
int *next = new int[m];
int j = -;
next[] = -;
for(int i = ; i < m; i++)
{
while(j >= && source[j+] != source[i])
j = next[j];
if(source[j+] == source[i])
j++;
next[i] = j;
}
j = -;
for(int i = ; i < n; i++)
{
while(j >= && source[j+] != target[i])
j = next[j];
if(source[j+] == target[i])
j++;
if(j >= m-)
{
printf("%d\n", i-m+);
j = next[j]; //继续查找更多
//return; //不再继续查找
}
}
}
KMP模板与讲解的更多相关文章
- hdu 1686 KMP模板
// hdu 1686 KMP模板 // 没啥好说的,KMP裸题,这里是MP模板 #include <cstdio> #include <iostream> #include ...
- Oulipo HDU 1686 KMP模板
题目大意:求模式串在主串中的出现次数. 题目思路:KMP模板题 #include<iostream> #include<algorithm> #include<cstri ...
- KMP模板(bin)
KMP模板 主要是kuangbin的模板,之后加了一点我的习惯和理解. kmpN() 作用:构造next数组 参数:模式串,模式串长度 kmpC() 作用:返回模式串在主串中出现的次数(可重复) 参数 ...
- HDU 1711 - Number Sequence - [KMP模板题]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1711 Time Limit: 10000/5000 MS (Java/Others) Memory L ...
- HDU 1711 Number Sequence(KMP模板)
http://acm.hdu.edu.cn/showproblem.php?pid=1711 这道题就是一个KMP模板. #include<iostream> #include<cs ...
- 剪花布条---hdu2087(kmp模板)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2087 kmp模板题: #include <cstdio> #include <cst ...
- Oulipo----poj3461(kmp模板)
题目链接:http://poj.org/problem?id=3461 和 减花布条 的题对比一下: 求s2中s1的个数kmp模板: #include<stdio.h> #include& ...
- kmp模板 && 扩展kmp模板
kmp模板: #include <bits/stdc++.h> #define PB push_back #define MP make_pair using namespace std; ...
- kuangbin专题16B(kmp模板)
题目链接: https://vjudge.net/contest/70325#problem/B 题意: 输出模式串在主串中出现的次数 思路: kmp模板 在 kmp 函数中匹配成功计数加一, 再令 ...
随机推荐
- JAVA Web 之 struts2文件上传下载演示(一)(转)
JAVA Web 之 struts2文件上传下载演示(一) 一.文件上传演示 1.需要的jar包 大多数的jar包都是struts里面的,大家把jar包直接复制到WebContent/WEB-INF/ ...
- cocos2dx下最大纹理大小取决于平台
原文:http://www.cocos2d-x.org/wiki/Max_size_of_textures_in_cocos2d-x_depends_on_each_platform 在理论上,coc ...
- iOS之应用程序国际化
一.程序国际化 准备工作: 1.首先我们要先创建一个工程,我们给他命名Internationalization-Demo,然后添加语言. 从代码中分离文本: 目前,应用展示的所有文本都是以硬编码字符串 ...
- 深入理解计算机系统第二版习题解答CSAPP 2.3
填写空白.单字节可以用两个十六进制数表示. 十进制 二进制 十六进制 0 0000 0000 0x00 167 1010 0111 0xA7 62 0011 1110 0x3E 188 1011 11 ...
- Amazon EC2上搭建VPN服务器
Amazon EC2 提供了一年免费试用,Micro Instance,配置是 1G 内存,共享 CPU,和每月 15G 的流量.搭一个 VPN 服务器绰绰有余了.操作系统我选的是 Amazon Li ...
- Windows redis集群搭建
一.Windows下Redis安装 下载地址https://github.com/dmajkic/redis/downloads,下载到的Redis支持32bit和64bit.根据自己实际情况选择,本 ...
- 【转】Android 应用测试总结
前提所有的功能分支已完成 启动:1. 启动入口:桌面正常启动,最近运行启动,所有程序列表中启动,锁屏快捷启动2. 其他入口:从其他程序开启应用,从外部以文件形式打开应用(如果有)3. 退回:从其他程序 ...
- JavaScript之call()&apply()
场景一:定义了一个类A,给它一个getName的方法:定义了一个类B,给它一个setName的方法:之前A只需要获取它的Name,B也只需要设置它的Name,但现在有新的需求,A和B都需要设置和获取他 ...
- Android开发之Menu组件
菜单Menu大致分为三种类型:选项菜单(OptionsMenu),上下文菜单(ContextMenu),子菜单(SubMenu). 1.选项菜单 在一个Activity界面中点击手机Menu键,在屏幕 ...
- 封装一个ISortable接口
using System;/// <summary>/// 排序规范/// </summary>/// <typeparam name="T"> ...