KMP算法:

此算法的本质是首先对于模板字符串进行计算,生成一个数组(next数组),该数组反映了模板字符串的情况。

例:

S:  ABADACABABCD

P:  ABAB

当我们查询到P3与S3(B和D)不相等时,如果是暴力算法,则在从第二个字符开始比较。

而KMP算法则是从P3开始比较(这里的P3只是根据上面举个例子,生成的next数组就是为了找到每一次如果失败后P3的位置,也就是

失配时,模式串向右移动的位数为:失配字符所在位置 - 失配字符对应的next 值)

通过数组再进行查找,以达到降低时间复杂度的目的。

next数组:

  

          

{next数组与最大长度值的关系:next 数组相当于“最大长度值” 整体向右移动一位,然后初始值赋为-1。}

本文具体是在理解KMP算法后的回顾,如果要看详解点击下方连接(讲解的十分清楚):

原文链接:https://blog.csdn.net/v_july_v/article/details/7041827

下面是具体用java实现的例子:

 public class kmp {

     private String ts;
private String ps;
kmp(){
}
kmp(String ts,String ps){
this.ts=ts;
this.ps=ps;
}
public void setts(String ts){
this.ts=ts;
}
public void setps(String ps){
this.ps=ps;
}
public int kmpmatch() { //KMP开始运算
int slen=ts.length();
int plen=ps.length();
int i=0;
int j=0;
int[] next =getNext(ps);
while(i<slen&&j<plen) {
if(j==-1||ts.charAt(i)==ps.charAt(j)) {
i++;
j++;
}else {
j=next[j];
}
}
if(j==plen) {
return i-j;
}else {
return -1;
} }
public int[] getNext(String ps) {
char[] p =ps.toCharArray();
int[] next = new int[p.length];
next[0]=-1;
int j=0;
int k=-1;
while(j<p.length-1) { //此算法的精髓!!!!!
if(k==-1||p[j]==p[k]) {
k++;
j++;
if(p[j]!=p[k]) {
next[j]=k;
}else {
next[j]=next[k];
}
}else {
k=next[k];
}
}
return next;
} public static void main(String[] args) {
// TODO Auto-generated method stub
String A = "wdnmwdnmwdnmddnm";
String B = "wdnmwdnmd";
kmp k =new kmp();
k.setts(A);
k.setps(B);
System.out.println(k.kmpmatch()); //输出的4
} }

最新文章

  1. ubuntu下各种压缩包的解压命令
  2. CSS text-transform 属性
  3. 【BZOJ】2084: [Poi2010]Antisymmetry
  4. Phython 学习笔记之——类的初步认识
  5. 理解python先编译后解释的特点
  6. 使用Java 8 Lambda表达式对Employee类进行操作
  7. Objective-C开发图书推荐
  8. Webbrowser模拟百度一下子点击事件
  9. Cocos2d-x 让精灵随手指移动起来二(简单实现)
  10. Eclipse图标含义
  11. gflags_static.lib 无法解析的外部符号 __imp__PathMatchSpec
  12. MT【241】红蓝两色染色
  13. 如何修改DEDECMS文章标题长度
  14. [LeetCode_98]Validate Binary Search Tree
  15. php无限分类二
  16. 随笔 -- IO -- Socket/ServerSocket -- 系统概述
  17. mysql09---sql语句优化
  18. ORA-01843: 无效的月份,执行sql语句更改为美国语言后仍然失败的解决办法
  19. 关于Python装饰器内层函数为什么要return目标函数的一些个人见解
  20. 2016&quot;百度之星&quot; - 初赛(Astar Round2A) A.All X 矩阵快速幂

热门文章

  1. 解决centos6系统上python3—flask模块的安装问题
  2. 红杉资本的Dropbox上市,国内哪些产品会跟着受益?
  3. Leetcode刷题记录 旋转矩阵
  4. springboot 不同类型多数据源配置及使用
  5. [PyTorch入门之60分钟入门闪击战]之训练分类器
  6. PM2.5如何引发心脏病的?
  7. 利用FinalData恢复shift+delete误删的文件
  8. TypeScript声明文件
  9. 如何在windows server上安装 Windows评估和部署工具包
  10. 自己查与写的批量比较bash