KMP 算法 再次学习
c++ 版后面再补
package cn.kbug.dynamic;
import java.util.Arrays;
/**
* KMP 算法本质上是对 搜索的字符串做优化,然后在匹配的时候,能做到非常省时间
* 如果搜索的串,都没有最大公连接相等子串,则此算法与暴力匹配无异
* @author Administrator
*
*/
public class KMPStringSearch {
public static void main(String[] args) {
// index = 14 是
// orgin[14] = 'A'
String orign = "BBC ABBCDABCD ABBADDACCD AB";
String key = "ABBA";
int next[] = getNext(key);
System.out.println(Arrays.toString(next));
int index = kmpSearchString(orign, key, next);
System.out.println("index="+index);
}
/**
*
* @param origin
* @param key
* @param next next数组是key的部分匹配表
* @return
*/
public static int kmpSearchString(String origin,String key,int next[]) {
for(int i = 0,j=0;i<origin.length();i++) {
// 这里就是说,拿到子串的上一个相同的字符进行比较
while(j > 0 && origin.charAt(i) != key.charAt(j)) {
j = next[j-1];
}
// 如果两个字符相当,则把 key的指针提前向后移一位
if(origin.charAt(i) == key.charAt(j)) {
j++;
}
// 我也不知道为什么要这样写
// 作用是返回当前匹配成功的字符串
// 原理我是真没明白,因为 在匹配的时候,i指针往后走,j也会往后走
// 但j 指的是key字符串,而i指的是 origin的指针
// j == key.length() 时,显然已经必然匹配成功
// 所以 i 则是匹配成功最后一个字符的位置
// 将 i 的位置 - j其实就是减key的字符长度
// +1 是因为 j 是等于字符长度,而非数组索引(因为j = key.len)
// 因为 每次判断后都会给j提前加上 1,所以j是越界的,但如果j 与key.len相等,则说明匹配成功
if(j == key.length()) {
// 写成 更好理解,j-1就是j的索引
return i-(j-1);
// return i-j+1;
}
}
return -1;
}
public static int[] getNext(String dest) {
int next[] = new int[dest.length()];
// 第一个永远是0,因为仅有一个字符串的时候,只能是0
next[0] = 0;
for (int i = 1, j = 0; i < dest.length(); i++) {
// 一直去寻找i与j相等的字符
// 如果没找到就把 j 的上一个next的值给J,意思说
// 如果没找到就从上一个开始重新找,但这个重新找
// 意味着必然会在数据中,找到 next[j-1]与i相等的字符
// 如果找不到,直到 j <= 0 了,则会自动跳出这次循环
// System.out.printf("j=%d, i =%d %c -> %c \n",j,i,dest.charAt(i) ,dest.charAt(j));
// 循环里的条件,每一次都会进行判断,所以不应该单拿出来
while(j >0 && dest.charAt(i) != dest.charAt(j)) {
// System.out.println("a");
j = next[j-1];
}
// 相等就把J++,则相等的长度+1
if(dest.charAt(i) == dest.charAt(j)) {
j++;
}
next[i] = j;
}
return next;
}
}
KMP 算法 再次学习的更多相关文章
- 串的应用与kmp算法讲解--学习笔记
串的应用与kmp算法讲解 1. 写作目的 平时学习总结的学习笔记,方便自己理解加深印象.同时希望可以帮到正在学习这方面知识的同学,可以相互学习.新手上路请多关照,如果问题还请不吝赐教. 2. 串的逻辑 ...
- 字符串模式匹配算法系列(二):KMP算法
算法背景: KMP算法是由Donald Knuth和Vaughan Pratt于1970年共同提出的,而James H.Morris也几乎同时间独立提出了这个算法.因此人们将其称作“克努特-莫里斯-普 ...
- 字符串匹配算法——KMP算法学习
KMP算法是用来解决字符串的匹配问题的,即在字符串S中寻找字符串P.形式定义:假设存在长度为n的字符数组S[0...n-1],长度为m的字符数组P[0...m-1],是否存在i,使得SiSi+1... ...
- 学习笔记-KMP算法
按照学习计划和TimeMachine学长的推荐,学习了一下KMP算法. 昨晚晚自习下课前粗略的看了看,发现根本理解不了高端的next数组啊有木有,不过好在在今天系统的学习了之后感觉是有很大提升的了,起 ...
- 第4章学习小结_串(BF&KMP算法)、数组(三元组)
这一章学习之后,我想对串这个部分写一下我的总结体会. 串也有顺序和链式两种存储结构,但大多采用顺序存储结构比较方便.字符串定义可以用字符数组比如:char c[10];也可以用C++中定义一个字符串s ...
- KMP算法学习以及小结(好马不吃回头草系列)
首先请允许我对KMP算法的三位创始人Knuth,Morris,Pratt致敬,这三位优秀的算法科学家发明的这种匹配模式可以大大避免重复遍历的情况,从而使得字符串的匹配的速度更快,效率更高. 首先引入对 ...
- KMP算法学习
kmp算法完成的任务是:给定两个字符串O和f,长度分别为n和m,判断f是否在O中出现,如果出现则返回出现的位置.常规方法是遍历a的每一个位置,然后从该位置开始和b进行匹配,但是这种方法的复杂度是O(n ...
- 学习KMP算法的一点小心得
KMP算法应用于 在一篇有n个字母的文档中 查找某个想要查找的长度为m的单词:暴力枚举:从文档的前m个字母和单词对比,然后是第2到m+1个,然后是第3到m+2个:这样算法复杂度最坏就达到了O(m*n) ...
- javascript实现KMP算法(没啥实用价值,只供学习)
简单粗暴上代码 KMP的原理我就不讲了,想转过弯儿来不容易,建议大家先学会了怎么推导出next数组规律,然后准备两张纸,大纸上写上一行你要匹配的目标字符串,并分别写出位置编号,小纸上写上一行,也写上位 ...
- KMP 算法 学习 整理
我自己整理的KMP算法的PDF文件:http://pan.baidu.com/s/1o8yKIi2提取密码:8291 别的就不多说啥了,感谢来自海子 博客园的 资料--
随机推荐
- 视频服务HDR Vivid 还原色彩,让所见成“真”
如今,视频正在以一种前所未有的方式渗入日常生活,是当下人们记录生活最热门的方式.所以,用户对视频的画质要求越来越高,App想要吸引更多的用户,拥有视频画质新技术的强力支撑很关键. HDR(High-D ...
- Windows Server 2019 安装 Oracle 19C RAC(VMWare虚拟机环境)
软件 Windows Server 2019 Standard Oracle 19C Oracle Grid 19 VMware Workstation 16 规划 共享存储,使用Windows Se ...
- 前端学习 linux —— 软件安装(Ubuntu)
软件安装(Ubuntu) 本篇主要讲解 ubuntu 中软件的安装.apt 的源.内网部署案例(graylog 为例),最后是 python 开发准备. apt 和 rpm 在linux 第一篇我们知 ...
- 关于linux mint更改资源管理器的快捷键
前言 首先要知道 linux mint 的默认资源管理器是 nemo 我很不习惯 ctrl+d 在nemo里面是 收藏到侧边栏 我习惯 ctrl+d 在windows上是删除文件 所以下面我就修改这个 ...
- easyui combobox的级联设置
<body> <input id="title" class="easyUI-combobox" //onSelect:在该combobox被 ...
- 【大数据课程】高途课程实践-Day01:Python编写Map Reduce函数实现各商品销售量展示(类似wordcount)
〇.概述 1.工具 http://www.dooccn.com/python3/ 在线运行Python代码 2.步骤 (1)⽣成代码测试数据 (2)编写Mapper逻辑 (3)编写Reducer逻辑 ...
- selenium常用配置
def init_chrome_options(self,): chrome_options = webdriver.ChromeOptions() # 设置浏览器初始 位置x,y & 宽高x ...
- 使用PyLint分析评估代码质量
什么是PyLint PyLint是一款用于评估Python代码质量的分析工具,它诞生于2003年,其最初十年的主要作者和维护者是Sylvain Thénault.PyLint可以用来检查代码是否错误. ...
- DOM(原生js事件绑定)
一:原生js事件绑定 1.开关灯案例 <!DOCTYPE html> <html lang="en"> <head> <meta char ...
- Mybatis源码解析之执行SQL语句
作者:郑志杰 mybatis 操作数据库的过程 // 第一步:读取mybatis-config.xml配置文件 InputStream inputStream = Resources.getResou ...