`
leichenlei
  • 浏览: 128148 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

模式匹配 KMP

阅读更多

上代码:

next道理懂了,运行过程还是没琢磨明白。

第二个next是优化的算法,还没看懂。

 

package com.test;

public class Test {

	/**
	 * kmp算法,主串指针不回溯的一种算法。时间复杂度可以达到O(n+m)nm是串长度
	 * 关键是要解决:当匹配到模式串的某个字符,发生不匹配之后;主串指针如何向右移动。(next就是解决这个问题)
	 * next返回的是:
	 * 1数组的意义:
	 * 	每个元素代表模式串一个字符,表示当这个字符失配,而前面的字符都匹配时,“主串当前指针要和模式串中的第几个字符继续比较”。
	 * 2这个结果数组的计算方式是:
	 * 	找到模式串当前这个字符紧挨着它前面的连续几个字符和模式串开头连续几个字符是否相等,
	 * 	(1)没有匹配记录0,
	 * 	(2)有匹配记录开头连续几个字符的个数(或者这个连续串的下个下标)。
	 * 	(3)-1代表母串指针需要移动
	 * @author yfchenlei
	 * @date 2012-9-20
	 * @param str 主串
	 * @param sub 子串
	 * @param pos 主串开始位置
	 * @return 
	 */
	public static int kmpIndexOf(String str, String sub, int pos){
		int i = pos;
		int j = 0;
		int[] next = next2(sub);
		while(i < str.length() && j < sub.length()){
			if(j == -1 || str.charAt(i) == sub.charAt(j)){
				i++;
				j++;
			}else{
				j = next[j];
			}
		}
		if(j == sub.length()){
			return i - sub.length();
		}
		
		return -1;
	}
	/**
	 * next算法
	 * @param sub 模式串
	 * @return
	 */
	public static int[] next1(String sub){
		int len= sub.length();
		int[] next = new int[len];
		int i = 0;
		int j = 0;
		while(i < len){
			 next[i] = j -1;
			 if(j == 0 || sub.charAt(i) != sub.charAt(j - 1))
				 j = 0;
			 i++;
			 j++;
		}
		return next;
	}
	/**
	 * 优化next算法
	 * @param sub 模式串
	 * @return
	 */
	public static int[] next2(String sub){
		int[] next = new int[sub.length()];  
		next[0] = -1;  
		int i = 0;  
		int j = -1;  
		while (i < sub.length() - 1) {  
			if (j == -1 || sub.charAt(i) == sub.charAt(j)) {  
				i++;  
				j++;  
				if (sub.charAt(i) != sub.charAt(j)) {  
					next[i] = j;  
				} else {  
					next[i] = next[j];  
				}  
			} else {  
				j = next[j];  
			}  
		}  
		return next; 
	}
	
	public static void main(String[] args) {

	}
}

 。

分享到:
评论

相关推荐

    数据结构模式匹配kmp算法

    **数据结构模式匹配KMP算法详解** 在计算机科学中,模式匹配是一项基本任务,它涉及到在一个文本串中寻找一个特定的子串。经典的算法有朴素匹配算法和更高效的Knuth-Morris-Pratt(KMP)算法。KMP算法是由Donald ...

    模式匹配KMP算法

    模式匹配 KMP 算法 模式匹配 KMP 算法是一种高效的字符串匹配算法,由 D.E.Knuth、J.H.Morris 和 V.R.Pratt 同时发现。该算法可以解决模式匹配的问题,即在一个大字符串中查找一个模式字符串的出现位置。 模式匹配...

    《字符串模式匹配KMP算法》教学课例设计[归纳].pdf

    《字符串模式匹配KMP算法》教学课例设计 在这篇教学设计中,我们旨在帮助学生掌握KMP字符串模式匹配算法的基本概念和应用。通过本课例设计,学生将了解KMP算法的应用普遍性、实现机制和时间复杂度,并掌握计算next...

    串的模式匹配KMP

    串的模式匹配的C语言实现,同时,还会有完好的界面,使用户输入的数据KMP实现与传统实现两种结果进行对比,完全能通过。

    c语言 字符串模式匹配KMP实验

    在完成以上代码后,通过运行`字符串模式匹配KMP实验.cpp`文件,你可以看到KMP算法在给定的主串和模式串上的匹配结果。这个实验有助于理解KMP算法的原理,以及如何在实际编程中应用它。同时,对于优化字符串匹配效率...

    字符串模式匹配KMP算法PPT学习教案.pptx

    字符串模式匹配KMP算法学习教案 KMP算法是字符串模式匹配中的经典算法之一,旨在快速查找目标字符串中的模式串。该算法的关键在于使用next数组来记录模式串中的模式函数值,从而避免了不必要的比较操作。 简单匹配...

    模式匹配KMP算法C代码

    ### 模式匹配KMP算法C代码解析 #### KMP算法简介 KMP(Knuth-Morris-Pratt)算法是一种高效的字符串匹配算法,由Donald Knuth、James H.Morris和Vaughan Pratt共同发明。它主要用于在一个主串中查找一个模式串的...

    字符串模式匹配KMP算法

    ### 字符串模式匹配KMP算法详解 #### 算法背景与意义 在计算机科学领域,字符串模式匹配是一项基础而关键的操作,广泛应用于文本检索、编译器设计、生物信息学等多个领域。传统的字符串匹配算法如朴素的线性搜索...

    字符串模式匹配KMP算法详解.doc

    ### 字符串模式匹配KMP算法详解 #### 一、引言 在计算机科学领域,字符串模式匹配是一项基本且重要的任务。它涉及到在一个较大的文本字符串(通常称为“主串”或“目标串”)中寻找一个较小的字符串(称为“模式串...

    C语言实现模式匹配KMP算法源代码

    6. **扩展知识**:除了KMP,还有其他模式匹配算法,如Boyer-Moore算法和Rabin-Karp算法,它们各有优缺点,适用于不同的场景。例如,Boyer-Moore算法通过跳过不必要的字符比较进一步优化了效率,而Rabin-Karp算法则...

    KMP字符串模式匹配算法ppt

    KMP(Knuth-Morris-Pratt)字符串模式匹配算法是一种高效的字符串搜索算法,由D.M. Knuth、V. Morris和J.H. Pratt在1970年提出。该算法避免了简单匹配算法中的不必要的回溯,显著提高了在文本字符串中查找模式字符串...

    LZ77算法与模式匹配KMP算法的结合及算法实现.doc

    LZ77算法与模式匹配KMP算法的结合及算法实现.doc

    模式匹配kmp算法的ppt

    KMP(Knuth-Morris-Pratt)算法是一种高效的字符串模式匹配算法,主要解决的问题是在一个主串(也称为文本串或目标串)中查找是否存在一个特定的模式串(也称为模式或子串)。该算法是由D.E.Knuth、V.R.Pratt和J.H....

    模式匹配的KMP算法

    "模式匹配的KMP算法" 模式匹配的KMP算法是计算机科学领域中的一种经典算法,用于解决串的模式匹配问题。该算法可以高效地查找目标串中是否包含某个模式串,并返回模式串在目标串中的起始位置。 模式匹配的KMP算法...

    字符串 模式匹配 kmp算法 java实现

    这是个比较难理解的算法,虽然代码就那么几行,但真正理解清楚还是要会时间的。

    KMP 字符串模式匹配详解

    KMP字符串模式匹配是一种高效的字符串搜索算法,由Knuth、Morris和Pratt三位学者提出,主要用于在一个长字符串(主串)中查找一个短字符串(子串)出现的位置。相较于简单的暴力匹配方法,KMP算法显著提升了匹配效率...

    KMP字符串模式匹配算法

    KMP字符串模式匹配算法是一种高效的字符串搜索算法,由D.E.Knuth、V.R.Morris和J.W.Pratt三位学者提出,因此得名KMP算法。该算法避免了在匹配过程中不必要的字符回溯,提高了匹配效率。下面我们将深入探讨KMP算法的...

    串的模式匹配算法 普通匹配和KMP匹配

    在提供的压缩包文件"String模式匹配KMP"中,可能包含了关于这两种匹配算法的详细代码实现,以及可能的测试用例。你可以下载并研究这些代码,以加深对算法的理解,并进行实践操作。通过动手编写和调试代码,你将能够...

    重庆大学数据结构实验报告,串的操作与KMP模式匹配算法源码及结果截屏

    在本实验报告中,主题是“串的操作与KMP模式匹配算法”,这涉及到计算机科学中的字符串处理和算法设计。实验的目的是让学生掌握基本的串操作以及实现著名的Knuth-Morris-Pratt(KMP)模式匹配算法。串在计算机科学中指...

    模式匹配算法设计

    理解模式匹配的含义,掌握简单匹配算法及模式匹配KMP算法 思想,实现(1)编程动态实现简单模式匹配算法及模式匹配KMP算(2)根据给定的主串与模式串,给出根据两种匹配算法进行匹配的各趟匹配结果; 应用例子: ...

Global site tag (gtag.js) - Google Analytics