KMP 算法 java实现

在网上找到的代码运行出来的模式值和资料里根据定义计算出来的值不一样, 没有找到合适的,于是手写了一个。

 

 

模式值定义:

(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;
	}
	
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值