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 算法 再次学习的更多相关文章

  1. 串的应用与kmp算法讲解--学习笔记

    串的应用与kmp算法讲解 1. 写作目的 平时学习总结的学习笔记,方便自己理解加深印象.同时希望可以帮到正在学习这方面知识的同学,可以相互学习.新手上路请多关照,如果问题还请不吝赐教. 2. 串的逻辑 ...

  2. 字符串模式匹配算法系列(二):KMP算法

    算法背景: KMP算法是由Donald Knuth和Vaughan Pratt于1970年共同提出的,而James H.Morris也几乎同时间独立提出了这个算法.因此人们将其称作“克努特-莫里斯-普 ...

  3. 字符串匹配算法——KMP算法学习

    KMP算法是用来解决字符串的匹配问题的,即在字符串S中寻找字符串P.形式定义:假设存在长度为n的字符数组S[0...n-1],长度为m的字符数组P[0...m-1],是否存在i,使得SiSi+1... ...

  4. 学习笔记-KMP算法

    按照学习计划和TimeMachine学长的推荐,学习了一下KMP算法. 昨晚晚自习下课前粗略的看了看,发现根本理解不了高端的next数组啊有木有,不过好在在今天系统的学习了之后感觉是有很大提升的了,起 ...

  5. 第4章学习小结_串(BF&KMP算法)、数组(三元组)

    这一章学习之后,我想对串这个部分写一下我的总结体会. 串也有顺序和链式两种存储结构,但大多采用顺序存储结构比较方便.字符串定义可以用字符数组比如:char c[10];也可以用C++中定义一个字符串s ...

  6. KMP算法学习以及小结(好马不吃回头草系列)

    首先请允许我对KMP算法的三位创始人Knuth,Morris,Pratt致敬,这三位优秀的算法科学家发明的这种匹配模式可以大大避免重复遍历的情况,从而使得字符串的匹配的速度更快,效率更高. 首先引入对 ...

  7. KMP算法学习

    kmp算法完成的任务是:给定两个字符串O和f,长度分别为n和m,判断f是否在O中出现,如果出现则返回出现的位置.常规方法是遍历a的每一个位置,然后从该位置开始和b进行匹配,但是这种方法的复杂度是O(n ...

  8. 学习KMP算法的一点小心得

    KMP算法应用于 在一篇有n个字母的文档中 查找某个想要查找的长度为m的单词:暴力枚举:从文档的前m个字母和单词对比,然后是第2到m+1个,然后是第3到m+2个:这样算法复杂度最坏就达到了O(m*n) ...

  9. javascript实现KMP算法(没啥实用价值,只供学习)

    简单粗暴上代码 KMP的原理我就不讲了,想转过弯儿来不容易,建议大家先学会了怎么推导出next数组规律,然后准备两张纸,大纸上写上一行你要匹配的目标字符串,并分别写出位置编号,小纸上写上一行,也写上位 ...

  10. KMP 算法 学习 整理

    我自己整理的KMP算法的PDF文件:http://pan.baidu.com/s/1o8yKIi2提取密码:8291 别的就不多说啥了,感谢来自海子 博客园的 资料--

随机推荐

  1. CSS处理器-Less/Scss

    HTML系列: 人人都懂的HTML基础知识-HTML教程 HTML元素大全(1) HTML元素大全(2)-表单 CSS系列: CSS基础知识筑基 常用CSS样式属性 CSS选择器大全48式 CSS布局 ...

  2. 【Spring系列】- 手写模拟Spring框架

    简单模拟Spring 生命不息,写作不止 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 一个有梦有戏的人 @怒放吧德德 分享学习心得,欢迎指正,大家一起学习成长! 前言 上次已经学习了 ...

  3. 阿里云 ACK 接入观测云

    简介 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理.2021 年成为国内唯一连续三年入选 Gartner 公共云容器报告的 ...

  4. C温故补缺(七):函数指针与回调函数

    函数指针与回调函数 函数指针就是指向函数调用栈地址的指针,定义时须和函数的返回值类型,参数类型相同 如: #include<stdio.h> int max(int x,int y){ r ...

  5. 解决"raise EnvironmentError("%s not found" % (_mysql_config_path,)) OSError: mysql_config not found"报错

    redhat系(如centos) yum install mysql-devel debain系(如ubuntu) sudo apt-get install libmysqlclient-dev

  6. ArcGISServer 10.4 虚拟机 安装 新建站点失败 Failed to configure the server machine ''. Server machine '' is not a local

    在通过 VMware  创建的虚拟机上(win7 64位)安装ArcServer 10.4,新建站点时出现下面的错误. Failed to configure the server machine ' ...

  7. 【Flink】概念、入门、部署(yarn和standalone模式)、架构(组件和运行流程)、批处理、流处理API、window、时间语义、Wartermark、ProcessFunction、状态编程、Table API和SQL、CEP、面试题

    一.Flink简介 1.概述 Apache Flink是为分布式.高性能.随时可用以及准确的流处理应用程序打造的开源流处理框架 对无界和有界数据流进行有状态计算 2.重要特点 (1)事件驱动型:从一个 ...

  8. 深度剖析 | 【JVM深层系列】[HotSpotVM研究系列] JVM调优的"标准参数"的各种陷阱和坑点分析(攻克盲点及混淆点)「 1 」

    [易错问题]Major GC和Full GC的区别是什么?触发条件呢? 相信大多数人的理解是Major GC只针对老年代,Full GC会先触发一次Minor GC,不知对否?我参考了R大的分析和介绍 ...

  9. 第三篇:前端基础之JavaScript

    前端基础之JavaScript   JavaScript概述 ECMAScript和JavaScript的关系 1996年11月,JavaScript的创造者--Netscape公司,决定将JavaS ...

  10. Python免杀过360

    本文章仅供参考学习 作者:mantou 博客地址:https://www.cnblogs.com/mantou0/ 分离免杀 这个我就不多说了,效果确实不错,网上关于分离免杀的也有很多文章 不分离过3 ...