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. Mp3文件标签信息读取和写入(Kotlin)

    原文:Mp3文件标签信息读取和写入(Kotlin) - Stars-One的杂货小窝 最近准备抽空完善了自己的星之小说下载器(JavaFx应用 ),发现下载下来的mp3文件没有对应的标签 也是了解可以 ...

  2. .NET跨平台框架选择之一 - Avalonia UI

    本文阅读目录 1. Avalonia UI简介 Avalonia UI文档教程:https://docs.avaloniaui.net/docs/getting-started 随着跨平台越来越流行, ...

  3. 【Devexpress】gridcontorl实现复制多个单元格

    1.设置复制的时候不复制标题在OptionsClipboard.CopyColumnHeaders=false 2.设置选择的方式为按照单元格选择,以及可以多选 OptionsSelection.Mu ...

  4. MyEclipse 中自动安插作者、注释日期等快捷键方法

    MyEclipse 中自动插入作者.注释日期等快捷键方法 MyEclipse 中自动插入作者.注释日期等de快捷键方法依次打开然后找到 Window -->Preferences->Jav ...

  5. Springboot自动装配源码及启动原理理解

    Springboot自动装配源码及启动原理理解 springboot版本:2.2.2 传统的Spring框架实现一个Web服务,需要导入各种依赖JAR包,然后编写对应的XML配置文件 等,相较而言,S ...

  6. JDK卸载

    JDK卸载 从环境变量里的JAVA_HOME里找到jdk的主程序,删掉 把JAVA_HOME删掉,在把path里跟java_home相关的也删掉 在cmd里运行java-version

  7. 使用PyLint分析评估代码质量

    什么是PyLint PyLint是一款用于评估Python代码质量的分析工具,它诞生于2003年,其最初十年的主要作者和维护者是Sylvain Thénault.PyLint可以用来检查代码是否错误. ...

  8. 编程思想的转变 软件开发目录规范 collections、time、datetime、 random模块

    目录 编程思想的转变 软件目录开发规范(重要) 内置模块:collections模块 简介 具名元组 namedtuple 实现二维坐标系 实现扑克牌 队列与堆栈 collection.deque() ...

  9. DenseNet 论文解读

    目录 目录 摘要 网络结构 优点 代码 问题 参考资料 摘要 ResNet 的工作表面,只要建立前面层和后面层之间的"短路连接"(shortcut),就能有助于训练过程中梯度的反向 ...

  10. python -m pip install --upgrade pip报No module named pip解决方法

    解决方法: 1. python -m ensurepip 2. python -m pip install --upgrade pip 注意:添加pip环境变量 在python安装目录下搜索pip3或 ...