笔记1 记录JAVA 的KMP算法

public class KMP {

    //获取NEXT数组的函数
	public static int[] GetArrNext(String str){
		int[] Next= new int[str.length()];
		String TempStr;
		String TempStr1;
		String TempStr2;
		int Temp;
		for(int i=0;i<str.length();i++){
			TempStr=str.substring(0, i+1);
			Temp = 0;
			
			for(int j = 1;j<TempStr.length();j++) {
				
				
				
				TS1=TempStr.substring(0,j);
				TS2=TempStr.substring(TempStr.length()-j,TempStr.length());
				
				if(TempStr1.equals(TempStr2)) {
					
					Temp = j;
				}
				
				
			Next[i]=Temp;
			}
		
		}
		return Next;
	}
	

    //匹配字符串函数
	public static void search(String mainStr , String modStr) {

		int main = 0;//主字符串匹配位置
		int mod = 0;//模式串匹配位置

        
		int[] Next = GetArrNext(modStr);
		
		while(main < mainStr.length())
		{
			if(mainStr.substring(main).equals(modStr.substring(mod))) {
				main++;//字符串相等,共同进一位
				mod++;
			}
			else if (mod != 0) {
				mod = Next[mod-1];//字符串不匹配了,模式串右移NEXT【mod-1】
			}
			else {
				main++;// 字符串失配,主串右移一位
			}
			
			if(mod == modStr.length()) {
				System.out.println(main-mod);//匹配成功,打印位置,继续右移寻找
				mod = Next[mod-1];
			}
		}
	}
	


	public static void main(String []args){
        String main	="ababaabaabac";
        String mod	="abaabac";
        search(main , mod);
    }
}

NEXT数组的定义:

对于字符串P[0]-P[X],NEXT[X]的值K恰好为满足P[0]~P[K]=P[X-K]~P[X]的最大值

优化求NEXT数组的过程:

已知NEXT[X]求NEXT[X+1]

令NOW = X

若P[X+1]=P[NEXT[NOW]] //P为单个字符

则NEXT[X+1]=NEXT[NOW]+1;       

若P[X+1]!=P[NEXT[NOW]]

令NOW = X-1

直到NEXT[NOW]=0

优化后

public static int[] GetArrNext2(String str){
		int[] Next= new int[str.length()+1];
		int i = 1,now = 0;
		
		while(i<str.length()) {
			
			if(str.substring(i)==str.substring(now)) {//字符相等则
				now++;
				Next[i]=now;
                i++;
				
			}
			else if (now!=0)
				now=Next[now-1];
			else {
				Next[i]=now;
                i++;
			}
		}
		
		
		return Next;
	}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值