在网上找到的代码运行出来的模式值和资料里根据定义计算出来的值不一样, 没有找到合适的,于是手写了一个。
模式值定义:
(1)next[0]= -1 意义:任何串的第一个字符的模式值规定为-1。
(2)next[j]= -1 意义:模式串T中下标为j的字符,如果与首字符相同,且j的前面的1—k个字符与开头的1—k个字符不等(或者相等但T[k]==T[j])(1≤k<j)。
如:T=”abCabCad” 则 next[6]=-1,因T[3]=T[6]
(3)next[j]=k 意义:模式串T中下标为j的字符,如果j的前面k个字符与开头的k个字符相等,且T[j] != T[k] (1≤k<j)。
即T[0]T[1]T[2]。。。T[k-1]==T[j-k]T[j-k+1]T[j-k+2]…T[j-1] 且T[j] != T[k].(1≤k<j);
(4)next[j]=0 意义:除(1)(2)(3)的其他情况。
取next 模式值的代码如下:
/**
* 获取模式值数组
* @param str
* @return
*/
public int[] nextModel(String str){
int[] arrays=new int[str.length()];
for (int i = 0; i < arrays.length; i++) {
arrays[i]=getNextModelVal(str, i);
}
return arrays;
}
/**
* 计算模式值
* @param index 索引值
* @return 当前索引位置的模式值
*/
private int getNextModelVal(String str,int index){
char[] crs = str.toCharArray();
if(index==0){
return -1;
}
int result = 0;
if(index>1){
begin:
for(int k=1;k<index;k++){
//从头取k个值
//从索引前取
int kindex=index-k;
for(int count = 0 ;count <k ;count ++ ){
if(crs[count] != crs[kindex+count]){
continue begin;
}
}
result=k;
break;
}
if(result==0){
//t[k]!=t[j]
result=-1;
}else{
if(crs[result]==crs[index]){
result=-1;
}
}
}
return result;
}
分享到:
相关推荐
KMP算法是通过分析子串,预先计算每个位置发生不匹配的时候,所需GOTO的下一个比较位置,整理出来一个next数组,然后在上面的算法中使用。
KMP算法实现,用Java语言实现的KMP字符串匹配算法
欢迎讨论
带有简单示例,亲测可用!!! 函数组成: public static void main(String[] args) private int search(String str, String pat) public static int[] generateNext(String dest)
这是个比较难理解的算法,虽然代码就那么几行,但真正理解清楚还是要会时间的。
java实现的kmp算法,参照原论文实现的,希望能有用
JAVA实现KMP算法,使用java语言实现的kmp算法
KMP算法的JAVA实现
在深入探讨Java实现细节之前,我们先来了解一下KMP算法的基本原理: 1. **前缀表(next 数组)**:KMP算法的核心在于一个辅助数组`next[]`,该数组用于记录模式串T的所有前缀与后缀的最长公共前缀长度。例如,对于...
下面我们将详细探讨KMP算法的原理、Java实现以及“next”数组的计算方法。 ### KMP算法原理 1. **模式匹配问题**:给定一个文本串s和一个模式串p,我们需要找出模式串在文本串中的所有出现位置。 2. **next数组**...
以下是KMP算法的基本Java实现步骤: - 定义`getNext()`函数,输入一个字符串,返回部分匹配表。 - 初始化两个指针,分别指向主字符串和模式字符串的起始位置。 - 使用while循环,遍历主字符串,每次循环中: - ...
总结,KMP算法是一种高效的字符串搜索算法,其Java实现主要涉及部分匹配表的构建和基于此表的字符串匹配过程。在实际编程中,理解和熟练掌握KMP算法能够帮助我们解决许多字符串相关的问题,提高程序性能。
Java实现的KMP(Knuth-Morris-Pratt)...综上所述,Java实现的KMP算法是一种优化的字符串匹配算法,通过部分匹配表减少不必要的比较,提高了搜索效率。理解并掌握这一算法对于解决涉及到字符串匹配的问题非常有帮助。
《KMP算法与Java实现详解》 在计算机科学中,字符串搜索算法是处理文本和数据的重要工具,其中KMP(Knuth-Morris-Pratt)算法因其高效性和实用性而备受青睐。KMP算法是由Donald Knuth、Vaughan Pratt和James H. ...
KMP算法的Java实现 public class KMP { public static int[] next; static void GetNext(String p,int next[]) { int pLen = p.length(); next[0] = -1;
* Java实现KMP算法 * * 思想:每当一趟匹配过程中出现字符比较不等,不需要回溯i指针, * 而是利用已经得到的“部分匹配”的结果将模式向右“滑动”尽可能远 * 的一段距离后,继续进行比较。 * * 时间复杂度O...
KMP(Knuth-Morris-Pratt)算法是一种高效的字符串搜索算法,由Donald Knuth、 Vaughan Pratt...在Java中实现KMP算法时,需要注意正确地计算部分匹配表并合理使用这个表来调整模式字符串的指针,以达到高效匹配的目的。
kmp算法的java代码
KMP算法的java实现,KMP详细解说请移步:https://blog.csdn.net/Michaelia_hu/article/details/100888201
Java实现KMP算法 KMP算法是字符串匹配算法中的一种,用于在一个主串中查找一个模式串的出现位置。该算法的主要思想是预处理模式串,计算其最长公共前后缀数组(Longest Proper Prefix which is also Suffix,简称 ...