KMP2

/** * Created by xie on 14-8-24. */ public class KMP { private String pat; private int M; private int R=256; private int dfa[][]; public KMP(String pat){ M=pat.length(); dfa=new int[R][M]; dfa[pat.charAt(0)][0]=1; for(int X=0,j=1;j<M;j++){ for(int c=0;c<R;c++) dfa[c][j]=dfa[c][X]; //set mismatch dfa[pat.charAt(j)][j]=j+1; //set match X=dfa[pat.charAt(j)][X]; //update X } } public int search(String text){ int N=text.length(); int i,j; for(i=0,j=0;i<N&&j<M;i++){ j=dfa[text.charAt(i)][j]; } if(j==M) return i-M; else return -1; } public static void main(String[] args) { String pat="abac"; String text="abadabadd"; KMP matcher=new KMP(pat); int index=matcher.search(text); System.out.println(index); } }

时间: 2024-08-02 10:35:53

KMP2的相关文章

KMP算法的理解和代码实现

KMP算法理解参考原文:http://kb.cnblogs.com/page/176818/ 举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD"? 1. 首先,字符串"BBC ABCDAB ABCDABCDABDE"的第一个字符与搜索词"ABCDABD"的第一个字符,进行比较.因为B与A不匹配,所以搜索词后移一位. 2. 因为B与A不匹配,搜索词再往后

KMP算法理解

字符串匹配算法之KMP算法一直以来都很难理解,虽然知道要减少不必要的匹配,但是仍然不懂里面的思想,即使看着代码.后来看到(2)中博客中的解释才清晰了许多,不至于在什么DFA,前缀表,部分匹配表等概念中迷失自己.主要的指导思想在于当发生不匹配的时候如何更有效的利用现在已经匹配的字符串的信息来加速移动过程,部分匹配表的存在正是挖掘一个字符串中前缀和后缀中最长公共串,比如ABCABCD,在匹配'D'时失败,考察字符"ABCABC",得到pmt['ABCABC']=3,所以外围循环索引直接前进

[日常训练]article

Description 小今天来写作文啦! 小非常善于堆砌辞藻.在洋洋洒洒写了一长篇之后,小发现作文中很多段落都似曾相识.小认为,如果一段字符在文章开头,结尾和中间都出现过,那么这段字符就可以被认为是一个"经典段". 现在小给你一篇文章,他想知道最长的一段"经典段"长度是多少? 注意,这里要求经典串至少出现三次,分别作为文章的前缀,后缀,及既非前缀也非后缀. Input 一行,给出一个由小写字母组成的字符串. Output 输出满足题目要求的非空子串,如果不存在这样

看数据结构写代码(18) KMP算法

求 子串 的 位置 有两种方法,一种是暴力搜索法,另一种就是KMP 算法.他们的效率 在一般的情况下,区别不大.但是在 串的 变化 范围特别小的情况下,例如 只有 0 和 1,KMP 的时间复杂度是 O(m+n),而暴力搜索法定时间 复杂度 是 O(m*n),(m,n分别指 子串 和 母串的 长度) 下面给出两种算法的代码 欢迎指出代码不足 // Kmp2.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <stdlib.h

KMP的理解与模板

KMP T串主串 P串模式串 i T串:A  B  C  A  B  C  D  H  I  J  K P串:      A  B  C  E j 保持i指针不回溯,通过修改j指针,让模式串尽量地移动到有效的位置 接下来我们自己来发现j的移动规律: 如图:C和D不匹配了,我们要把j移动到哪?显然是第1位.为什么?因为前面有一个A相同啊: 如下图也是一样的情况: 可以把j指针移动到第2位,因为前面有两个字母是一样的: 当匹配失败时,j要移动到下一个位置k.(模式串)存在着这样的性质:最前面的k个字