关于模式匹配算法,BF是比较号理解的,但是属于暴力匹配,资源浪费太严重。

KMP算法确实比较难懂(PS:反正我是看了好久才弄明白,可能也是我理解能力太差=_=)

下面是我的一些心得。

http://www.cnblogs.com/yjiyjige/p/3263858.html

这个是我在网上找到的一个网友的帖子,觉得将得很详细,看了之后恍然大悟。

1.原理

KMP算法原理就是在主串和子串做匹配的时候,每次遇到不想同的元素即不能继续匹配时,保持主串正在匹配的那个元素不变,至变更子串的元素(向前移动游标),从而达到减小时间复杂度的目的。即:“利用已经部分匹配这个有效信息,保持i指针不回溯,通过修改j指针,让模式串尽量地移动到有效的位置。”

结合这个帖子:http://www.cnblogs.com/tangzhengyue/p/4315393.html

我觉得最重要的是这个图要懂:

代码中,BMP方法部分相比于BF算法改动不大,主要是在判断条件上加了一个

当si=tj时,i/j分别加1,继续比较;

当si!=tj时,i值不变,j变为next(j),继续比较。

做比较时有:1.j退回到next[j]时,若si=tj(tnext(j)),则i/j分别加1,继续比较,若si!=tj(tnext(j)),则j退回j=next[next[j]](即退回k=next[j],j=next[k],这是一个递归,直到k=-1,此时next[k]=0,k=1,next[k]=0);

2.j退回到j=-1时,另主串和子串下标各加1.

分析条件,子串中的元素要进行比较的情况有:如上黄颜色标出的情况,进行综合得:

有代码:

int j=-1;

while(i

if(j==-1||p[i]==s[i]){

i++;j++}

else{

j=next[j];}}

关于j的变化关系由一个next数组来存储。

对整个子串进行遍历:(0<=j

int[] next1=new int[s.length];//next数组初始化

next1[0]=-1;//next数组的第一个元素初始化

int j=0;

int k=-1;//初始化

while(j

{

if(k==-1||s[j]==s[k])//如果s[j]==s[k]或k==-1,则需要移动j,或则做单纯的做i++ j++,然后值j为0,子串从头开始

{

if(s[++j]==s[++k]){

next1[j]=next1[k];

}else{

System.out.println("j:"+j);

System.out.println("k:"+k);

next1[j]=k;

}

}else{//s[j]==s[k]和k==-1,都不满足,则往更深以层次比较next(k)

//此时s[j]!=s[k]

k=next1[k];//取k结束的串的最长匹配子串

}

总代码:

package exercise;

import java.util.Scanner;

public class KMP {//与BF算法有四个不同的地方

public static int km(String s1,String s2){

char[] p=s1.toCharArray();

char[] s=s2.toCharArray();

int[] next=getnext(s2);//与BF算法相比多了一个next[]数组 1

for(int l=0;l

System.out.print(next[l]+" ");

}

int i=0;//主串

int j=0;//子串

while(i

if(j==-1||p[i]==s[j]){//j==-1是当主串和子串的第一个元素不等时  多了一个j的判断条件 2

i++;

j++;

}else{

//与BF算法不同的是,此时i不在返回,只有j动   //i不动      3

j=next[j];//j回到指定位置

//j不是移动到0,而智能的移动到字串中的最长匹配串的结束位置+1     4

}

}//while结束

if(j==s.length){//s.length

return i-j;

}else{

return -1;

}

}

public static int[] getnext(String s2){

char[] s=s2.toCharArray();//将要个生成next数组的子串转换为char数组

int[] next1=new int[s.length];//next数组初始化

next1[0]=-1;//next数组的第一个元素初始化

int j=0;

int k=-1;//初始化

while(j

{

if(k==-1||s[j]==s[k])//如果s[j]==s[k]或k==-1,则需要移动j,或则做单纯的做i++ j++,然后值j为0,子串从头开始

{

if(s[++j]==s[++k]){

next1[j]=next1[k];

}else{

System.out.println("j:"+j);

System.out.println("k:"+k);

next1[j]=k;

}

}else{//s[j]==s[k]和k==-1,都不满足,则往更深以层次比较next(k)

//此时s[j]!=s[k]

k=next1[k];//取k结束的串的最长匹配子串

}

}

return next1;

}

public static void main(String[] args){

Scanner sc=new Scanner(System.in);

System.out.println("请输入主串:");

String p=sc.nextLine();

System.out.println("请输入子串:");

String s=sc.nextLine();

int i=km(p,s);//静态的方法main()只能调用静态的方法b(),因为静态方法早于对象而创建,

//调用非静态方法时要提前创建对象,非静态方法要等对象创建之后才能被创建

System.out.println("子串在主串中的位置:"+i);

}

}结果:

请输入主串:

ababcabdabcabca

请输入子串:

abcabc

j:1

k:0

j:2

k:0

-1 0 0 -1 0 0 子串在主串中的位置:8

数据结构java语言kmp_数据结构(java语言描述)模式匹配——KMP算法相关推荐

  1. 字符串模式匹配KMP算法详解(Python语言)

    问题描述 主串为 ′ababcabcacbab′ ′ a b a b c a b c a c b a b ′ 'ababcabcacbab',模式串为 ′abcac′ ′ a b c a c ′ 'a ...

  2. 数据结构——模式匹配kmp算法

    暴力算法 //暴力算法 int index(SString S,SString T,int pos) {int i=pos,j=1;while(i<=S[0]&&j<=T[ ...

  3. KMP算法-严蔚敏数据结构

    KMP 算法是 D.E.Knuth.J,H,Morris 和 V.R.Pratt 三位神人共同提出的,称之为 Knuth-Morria-Pratt 算法,简称 KMP 算法.该算法相对于 Brute- ...

  4. 英汉字典程序C语言,分享纯C语言英汉字典源码

    近期深受开源的精神影响,并为之深深感动,想了很久,今天把我代码积累多年的一个"英汉字典"公布. 研一的时候因为无聊或者因为兴趣,做了一个纯C语言的英汉字典.核心算法是KMP快速查找 ...

  5. java语言链栈_Java语言实现数据结构栈代码详解

    近来复习数据结构,自己动手实现了栈.栈是一种限制插入和删除只能在一个位置上的表.最基本的操作是进栈和出栈,因此,又被叫作"先进后出"表. 首先了解下栈的概念: 栈是限定仅在表头进行 ...

  6. 数据结构源码笔记(C语言描述)汇总

    数据结构源码笔记(C语言):英文单词按字典序排序的基数排序 数据结构源码笔记(C语言):直接插入排序 数据结构源码笔记(C语言):直接选择排序 数据结构源码笔记(C语言):置换-选择算法 数据结构源码 ...

  7. 高时空损耗的Scanner会卡爆程序(记洛谷P1567的Java性能优化,Java语言描述)

    写在前面 对性能调优,其实我一个弱鸡,用的也不多,特别是这种OJ连JVM调优都不成. 大佬s勿喷,且看小菜鸡如何在一道OJ题里与Java性能搏斗! 题目要求 P1567题目链接 简单分析 10^9,没 ...

  8. 数据结构 python的书推荐-java数据结构书一般推荐看什么好?

    想要学习java的各种数据结构,一本良好的书籍会让你受益匪浅,本文就来推荐一些学习java数据结构适合看的书. 一.入门推荐 因为是入门,所以我们先不要求实现,阅读一些通过图片,打比方等通俗易懂的方法 ...

  9. java书籍_2020年java从入门到进阶书籍推荐,基础\自学\编程\数据结构\后端\虚拟机\网络\设计模式书籍...

    前言 1. 基础书籍 2. 并发书籍 3. JVM虚拟机书籍 4. 网络相关 5. 操作系统 6. 数据结构与算法 7. 数据库 8. 设计模式 前言 从1996年到现在,java已经走过了24个年头 ...

最新文章

  1. 浅议 JavaScript 的 Promises/Futures 模式
  2. aurora IP中选择了小端支持,但小端体现在了什么地方呢?
  3. 关于WordPress中字体加载慢的问题解决方案(转)
  4. 使用curl获取Location:重定向后url
  5. 从用户接触到完成需求说明书
  6. Android 关于“NetworkOnMainThreadException”
  7. python生成四位随机数
  8. linux c之创建进程fork和vfork函数之间的区别
  9. python round保留小数位_Python-其他-round()保留小数位时遇到的问题
  10. python选择应用窗口到最前面
  11. gnss rtcm rtklib Ntrip...
  12. 06-maven的profile和Spring boot 的profile整合
  13. InstallShield 取消特定安装步骤
  14. 做教学直播时,如何做PPT课件直播?
  15. 隐藏软键盘与弹窗总结
  16. 人体神经元细胞分布图片,神经元人体分布大图
  17. centos7 虚拟机没有网解决办法
  18. 逻辑回归LogisticRegression
  19. 【开关电源】降压变换器(BUCK)的断续模式建模
  20. 发现一个很厉害的抖音视频发布干货分享给大家

热门文章

  1. 泛化,过拟合,欠拟合素材(part1)--python机器学习基础教程
  2. 在桌面拔和平精英改成计算机,和平精英一键修改画质电脑版
  3. scala to java_Scala 2.13 以后Java集合与Scala集合互相转换
  4. 33个热门数据分析软件,你都用过哪些?
  5. 你聚类个数是靠拍的?
  6. 2021年12月2日星期四的 Hybris Eclipse 导入尝试
  7. 为什么在大型 Angular 应用里我们需要使用 ngrx
  8. de.hybris.platform.servicelayer.dto.converter.ConversionException
  9. SAP Spartacus 关于列表点击focus Accessibility的需求
  10. 今日头条PC端的状态管理,使用的实现库是Redux