上代码:
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算法详解** 在计算机科学中,模式匹配是一项基本任务,它涉及到在一个文本串中寻找一个特定的子串。经典的算法有朴素匹配算法和更高效的Knuth-Morris-Pratt(KMP)算法。KMP算法是由Donald ...
模式匹配 KMP 算法 模式匹配 KMP 算法是一种高效的字符串匹配算法,由 D.E.Knuth、J.H.Morris 和 V.R.Pratt 同时发现。该算法可以解决模式匹配的问题,即在一个大字符串中查找一个模式字符串的出现位置。 模式匹配...
《字符串模式匹配KMP算法》教学课例设计 在这篇教学设计中,我们旨在帮助学生掌握KMP字符串模式匹配算法的基本概念和应用。通过本课例设计,学生将了解KMP算法的应用普遍性、实现机制和时间复杂度,并掌握计算next...
串的模式匹配的C语言实现,同时,还会有完好的界面,使用户输入的数据KMP实现与传统实现两种结果进行对比,完全能通过。
在完成以上代码后,通过运行`字符串模式匹配KMP实验.cpp`文件,你可以看到KMP算法在给定的主串和模式串上的匹配结果。这个实验有助于理解KMP算法的原理,以及如何在实际编程中应用它。同时,对于优化字符串匹配效率...
字符串模式匹配KMP算法学习教案 KMP算法是字符串模式匹配中的经典算法之一,旨在快速查找目标字符串中的模式串。该算法的关键在于使用next数组来记录模式串中的模式函数值,从而避免了不必要的比较操作。 简单匹配...
### 模式匹配KMP算法C代码解析 #### KMP算法简介 KMP(Knuth-Morris-Pratt)算法是一种高效的字符串匹配算法,由Donald Knuth、James H.Morris和Vaughan Pratt共同发明。它主要用于在一个主串中查找一个模式串的...
### 字符串模式匹配KMP算法详解 #### 算法背景与意义 在计算机科学领域,字符串模式匹配是一项基础而关键的操作,广泛应用于文本检索、编译器设计、生物信息学等多个领域。传统的字符串匹配算法如朴素的线性搜索...
### 字符串模式匹配KMP算法详解 #### 一、引言 在计算机科学领域,字符串模式匹配是一项基本且重要的任务。它涉及到在一个较大的文本字符串(通常称为“主串”或“目标串”)中寻找一个较小的字符串(称为“模式串...
6. **扩展知识**:除了KMP,还有其他模式匹配算法,如Boyer-Moore算法和Rabin-Karp算法,它们各有优缺点,适用于不同的场景。例如,Boyer-Moore算法通过跳过不必要的字符比较进一步优化了效率,而Rabin-Karp算法则...
KMP(Knuth-Morris-Pratt)字符串模式匹配算法是一种高效的字符串搜索算法,由D.M. Knuth、V. Morris和J.H. Pratt在1970年提出。该算法避免了简单匹配算法中的不必要的回溯,显著提高了在文本字符串中查找模式字符串...
LZ77算法与模式匹配KMP算法的结合及算法实现.doc
KMP(Knuth-Morris-Pratt)算法是一种高效的字符串模式匹配算法,主要解决的问题是在一个主串(也称为文本串或目标串)中查找是否存在一个特定的模式串(也称为模式或子串)。该算法是由D.E.Knuth、V.R.Pratt和J.H....
"模式匹配的KMP算法" 模式匹配的KMP算法是计算机科学领域中的一种经典算法,用于解决串的模式匹配问题。该算法可以高效地查找目标串中是否包含某个模式串,并返回模式串在目标串中的起始位置。 模式匹配的KMP算法...
这是个比较难理解的算法,虽然代码就那么几行,但真正理解清楚还是要会时间的。
KMP字符串模式匹配是一种高效的字符串搜索算法,由Knuth、Morris和Pratt三位学者提出,主要用于在一个长字符串(主串)中查找一个短字符串(子串)出现的位置。相较于简单的暴力匹配方法,KMP算法显著提升了匹配效率...
KMP字符串模式匹配算法是一种高效的字符串搜索算法,由D.E.Knuth、V.R.Morris和J.W.Pratt三位学者提出,因此得名KMP算法。该算法避免了在匹配过程中不必要的字符回溯,提高了匹配效率。下面我们将深入探讨KMP算法的...
在提供的压缩包文件"String模式匹配KMP"中,可能包含了关于这两种匹配算法的详细代码实现,以及可能的测试用例。你可以下载并研究这些代码,以加深对算法的理解,并进行实践操作。通过动手编写和调试代码,你将能够...
在本实验报告中,主题是“串的操作与KMP模式匹配算法”,这涉及到计算机科学中的字符串处理和算法设计。实验的目的是让学生掌握基本的串操作以及实现著名的Knuth-Morris-Pratt(KMP)模式匹配算法。串在计算机科学中指...
理解模式匹配的含义,掌握简单匹配算法及模式匹配KMP算法 思想,实现(1)编程动态实现简单模式匹配算法及模式匹配KMP算(2)根据给定的主串与模式串,给出根据两种匹配算法进行匹配的各趟匹配结果; 应用例子: ...