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. 「Python实用秘技11」在Python中利用ItsDangerous快捷实现数据加密

    本文完整示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/PythonPracticalSkills 这是我的系列文章「Python实用秘技」的第11 ...

  2. 谈软件-专家谈C/C++重构的操作与思路

    1.Refactoring: 对软件内部结构的一种调整,目的是不该被软件的可观察行为的前提上,提高其可理解性,降低其修改成本. 2.代码坏味道 2.1.不易复用 2.2.不易理解 2.3.存在冗余 3 ...

  3. 远程桌面报错credssp

    远程桌面连接的时候有时出现"出现身份验证错误.要求的函数不受支持:这可能是由于CredSSP 加密 Oracle 修正"的提示, 针对这种情况有以下两种版本的操作系统解决方案: w ...

  4. Permanently added the RSA host key for IP address '192.30.253.113' to the list of known hosts.

    $git push origin master 报错: Warning: Permanently added the RSA host key for IP address '192.30.253.1 ...

  5. Linux 基础-文件权限与属性

    一,文件类型 1.1,概述 1.2,正规文件(regular file) 1.3,目录(directory) 1.4,链接文件(link) 1.5,设备与装置文件(device) 1.6,资料接口文件 ...

  6. Day34.2:Calendar详解

    Calendar 1.1 概述 Date类中很多方法被Calendar所取代,Calendar类提供了获取和设置各种日历的方法. 1.2 方法 构造方法:Calendar类的构造器被protected ...

  7. kestrel网络编程--开发Fiddler

    1 文章目的 本文讲解基于kestrel开发类似Fiddler应用的过程,让读者了解kestrel网络编程里面的kestrel中间件和http应用中间件.由于最终目的不是输出完整功能的产品,所以这里只 ...

  8. 【Redis场景2】缓存更新策略(双写一致)

    在业务初始阶段,流量很少的情况下,通过直接操作数据是可行的操作,但是随着业务量的增长,用户的访问量也随之增加,在该阶段自然需要使用一些手段(缓存)来减轻数据库的压力:所谓遇事不决,那就加一层. 在当前 ...

  9. [数据结构]普里姆(Prim)算法生成最小生成树

    前提介绍:最小生成树概念 一个连通图的生成树是图的极小连通子图,它包含图中的所有定点,并且只含尽可能少的边,这意味着对于生成树来说,就砍去使生成树变成非连通图:若给它怎家一条边就会形成图中的一条回路. ...

  10. HHKB Programming Contest 2022 Winter(AtCoder Beginner Contest 282)

    前言 好久没有打 AtCoder 了.有点手生.只拿到了 \(\operatorname{rk}1510\),应该上不了多少分. 只切了 \(\texttt{A,B,C,D}\) 四题. A - Ge ...