在网上找到的代码运行出来的模式值和资料里根据定义计算出来的值不一样, 没有找到合适的,于是手写了一个。
模式值定义:
(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字符串匹配算法
kMP算法JavakMP算法JavakMP算法JavakMP算法JavakMP算法JavakMP算法JavakMP算法JavakMP算法JavakMP算法JavakMP算法JavakMP算法JavakMP算法JavakMP算法JavakMP算法JavakMP算法JavakMP算法JavakMP算法JavakMP算法Java...
欢迎讨论
带有简单示例,亲测可用!!! 函数组成: public static void main(String[] args) private int search(String str, String pat) public static int[] generateNext(String dest)
这是个比较难理解的算法,虽然代码就那么几行,但真正理解清楚还是要会时间的。
java实现的kmp算法,参照原论文实现的,希望能有用
用java写的KMP算法,这是个描述KMP算法的java类,里面包含了主函数的实例
JAVA实现KMP算法,使用java语言实现的kmp算法
KMP算法的JAVA实现
kmp算法 kmp算法的Java实现
kmp算法 kmp算法_基于Java实现的kmp算法
kmp算法 kmp算法_基于Java实现kmp字符串搜索算法
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...
java实现KMP算法,代码非常简单,容易理解。
kmp算法的java代码
kmp算法
KMP算法的java实现,KMP详细解说请移步:https://blog.csdn.net/Michaelia_hu/article/details/100888201
以下是对KMP算法实现步骤的详细介绍,以及使用Java语言实现的带注释代码。 KMP算法实现步骤: 计算部分匹配表(Partial Match Table, PMT): 这个表也被称为“前缀函数”或“失败函数”。对于模式串P的每一个位置i...