模式匹配之Kmp算法

Kmp:

算法定义借鉴wikipedia:

http://en.wikipedia.org/wiki/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm#KMP_algorithm

代码:

import java.util.Scanner;

public class Main {

	public static void main(String[] argv){

		Main u = new Main();
		Scanner in = new Scanner(System.in);
		String t = in.nextLine();
		String s = in.nextLine();
		int[] next = new int[s.length()];
		char [] n = t.toCharArray();
		char [] m = s.toCharArray();
		next = u.check(m);
		for(int i=0; i<next.length; i++){
			System.out.print(next[i]);
		}
		System.out.println();
		int k=0; int num=0;
		for(int i=0; i<t.length();i++){

			if(n[i]==m[k])
			   {
				k++;
				if(k==m.length)
					{num++;k=next[k-1];}
			   }
			else
				k=next[k];
		}
		System.out.println(num);

	}

	public int[] check(char [] t){

		int next[] = new int [t.length];
		next[0]=0;
		int j=1;
		while(j<t.length){
			int k=next[j-1];
			while (t[j]!=t[k]&&k!=0)
				k=next[k-1];
			if(t[j]==t[k])
				next[j]=k+1;
			else
				next[j]=0;
           // System.out.println(" "+next[j]);
            j++;
		}
		return next;
	}
}

  运行效果:

时间: 2024-10-12 22:36:28

模式匹配之Kmp算法的相关文章

数据结构例程——串的模式匹配(KMP算法)

本文针对数据结构基础系列网络课程(4):串中第5课时串的模式匹配(KMP算法). 问题:串的模式匹配 KMP算法: #include <stdio.h> #include "sqString.h" void GetNext(SqString t,int next[]) /*由模式串t求出next值*/ { int j,k; j=0; k=-1; next[0]=-1; while (j<t.length-1) { if (k==-1 || t.data[j]==t.d

字符串模式匹配之KMP算法图解与 next 数组原理和实现方案

之前说到,朴素的匹配,每趟比较,都要回溯主串的指针,费事.则 KMP 就是对朴素匹配的一种改进.正好复习一下. KMP 算法其改进思想在于: 每当一趟匹配过程中出现字符比较不相等时,不需要回溯主串的 i指针,而是利用已经得到的“部分匹配”的结果将模式子串向右“滑动”尽可能远的一段距离后,继续进行比较.如果 ok,那么主串的指示指针不回溯!算法的时间复杂度只和子串有关!很好. KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的,很自然的,需要一个函数来存储匹

模式匹配的KMP算法详解

这种由D.E.Knuth,J.H.Morris和V.R.Pratt同时发现的改进的模式匹配算法简称为KMP算法.大概学过信息学的都知道,是个比较难理解的算法,今天特把它搞个彻彻底底明明白白. 注意到这是一个改进的算法,所以有必要把原来的模式匹配算法拿出来,其实理解的关键就在这里,一般的匹配算法: int Index(String S,String T,int pos)//参考<数据结构>中的程序 { i=pos;j=1;//这里的串的第1个元素下标是1 while(i<=S.Length

模式匹配的KMP 算法

常见的字符串匹配时,模式串长度为n,源串长度为m,则从头匹配,两个指针i指向源串,j指向模式串,如遇到不同则回溯使j=0,这样就要反复匹配会使效率变低. 因为在如今i之前 的模式串与匹配串的匹配是同样的,即回溯时,不用将模式串与源串进行匹配,而仅仅将模式串与自身匹配就可以得到其是否须要回溯以及回溯到何处.则我们能够在进行模式匹配之前,想对模式串进行自我匹配,来计算出对于i在模式串的任何位置匹配失败后回溯的位置. 而对于自身匹配的算法另一个优化的地方在于,模式串在b位置匹配到自身的a位置,然后推断

KMP算法(主要解释next表的构造)

零.先说点题外的吧 这一章学串,其中最经典的就是模式匹配的KMP算法.其实也算是巩固自己的知识,我把这一章的知识和zy顺了一遍,主要讲了KMP算法.大概讲了一个小时,讲完了之后,zy很兴奋的说了一句:感觉好神奇啊.很感动.感觉终于让一个没有领略过算法魅力的人感受到了算法的魅力,感觉她能从简单几行代码里“发现人类智慧居然如此璀璨”. 很遗憾. 我等你终有一天可以东山再起王者归来. 一.KMP思路 1.想要理解KMP,就要先理解最朴素的暴力算法 //此处省略N个字……不懂看书吧 2.KMP相当于对它

串的匹配:朴素匹配&amp;amp;KMP算法

引言 字符串的模式匹配是一种经常使用的操作. 模式匹配(pattern matching),简单讲就是在文本(text,或者说母串str)中寻找一给定的模式(pattern).通常文本都非常大.而模式则比較短小.典型的样例如文本编辑和DNA分析. 在进行文本编辑时,文本一般是一段话或一篇文章,而模式则经常是一个单词.若是对某个指定单词进行替换操作,则要在整篇文章中进行匹配,效率要求肯定是非常高的. 模式匹配的朴素算法 最简单也最easy想到的是朴素匹配.何为朴素匹配,简单讲就是把模式串跟母串从左

串的匹配:朴素匹配&amp;KMP算法

引言 字符串的模式匹配是一种常用的操作.模式匹配(pattern matching),简单讲就是在文本(text,或者说母串str)中寻找一给定的模式(pattern).通常文本都很大,而模式则比较短小.典型的例子如文本编辑和DNA分析.在进行文本编辑时,文本通常是一段话或一篇文章,而模式则常常是一个单词.若是对某个指定单词进行替换操作,则要在整篇文章中进行匹配,效率要求肯定是很高的. 模式匹配的朴素算法 最简单也最容易想到的是朴素匹配.何为朴素匹配,简单讲就是把模式串跟母串从左向右或从右向左一

串模式匹配之BF和KMP算法

本文简要谈一下串的模式匹配.主要阐述BF算法和KMP算法.力求讲的清楚又简洁. 一 BF算法 核心思想是:对于主串s和模式串t,长度令为len1,len2,   依次遍历主串s,即第一次从位置0开始len2个字符是否与t对应的字符相等,如果完全相等,匹配成功:否则,从下个位置1开始,再次比较从1开始len2个字符是否与t对应的字符相等.... BF算法思路清晰简单,但是每次匹配不成功时都要回溯. 下面直接贴代码: int BF_Match(char *s, char *t) { int i=0,

字符串模式匹配KMP算法中的next数组算法及C++实现

一.问题描述: 对于两个字符串S.T,找到T在S中第一次出现的起始位置,若T未在S中出现,则返回-1. 二.输入描述: 两个字符串S.T. 三.输出描述: 字符串T在S中第一次出现的起始位置,若未出现,则返回-1. 四.输入例子: ababaababcbababc 五.输出例子: 5 六.KMP算法解析: KMP算法分为两步,第一步是计算next数组,第二步是根据next数组通过较节省的方式回溯来比较两个字符串. 网络上不同文章关于next数组的角标含义略有差别,这里取参考文献中王红梅<数据结构