找工作面试之二KMP算法

写在前面的话

一般情况下学习东西我们都会问自己What,Why,How这三个问题,同样我们也要知道什么是KMP为什么要用KMP怎么用KMP这三个问题!

What is KMP

KMP算法主要是用来做字符串匹配的,他和我们挨个挨个匹配的基础上改进而来的。举个例子,一般情况下加入有母串M1 M2 M3 M4 M5 M6 M7 M8 M9 M10有子串S1 S2 S3 S4一般情况下我们都是先那S1和M1匹配,若匹配则在匹配 S2 M2,否则匹配 S1 和 M1,加入子串没有别的特征这样做的话也是可以的,但当子串为abcdefabc的时候这样我们引入KMP可以大大节省时间。

Why Need KMP

比如说我们现在又母串ababcababa子串ababa,当我匹配成时候!我们其实可以跳跃匹配,不要再从第二个重新匹配的,因为子串有对称串,KMP就是这样在一般匹配上改进的。

How KMP

在第二部分,我们知道了可以跳跃匹配,但是跳跃多少等等,就是我们接下来要解决的问题:
package kmp;
import java.util.Scanner;
public class Main {
	public static void main(String[] args) {
		String moduelString =  "";//母串
		String matchingString = "";//要去匹配的串
		Scanner sc = new Scanner( System.in);
		moduelString = sc.nextLine();
		matchingString = sc.nextLine();
		
		if(KMPMatch(moduelString, matchingString)==-1) System.out.println("不匹配");
		else System.out.println("匹配");
		if(moduelString.contains(matchingString)) System.out.println("contain");

	}
	public static int  KMPMatch(String moduelString, String matchingString){
		int flag = -1;
		int i = 0;
		int j = 0;
		int[] next = new int[matchingString.length()];
		getNext(matchingString, next);
		while(i<moduelString.length()){
			if(j==-1||moduelString.charAt(i)==matchingString.charAt(j))
	        {
	            i++;
	            j++;
	        }
	        else
	        {
	            j=next[j];       //消除了指针i的回溯
	        }
	        if(j== matchingString.length()) return i-j;       
	    }
		return flag;
	}
	
	public static void getNext(String matchingString,int[] next ){
		next[0] = -1;
		for (int i = 1; i < next.length; i++) next[i] = 0;
		int j=0;
		int k =-1;
		 while(j<matchingString.length()-1)
		    {
		        if(k==-1|| matchingString.charAt(j)== matchingString.charAt(k))//匹配的情况下,p[j]==p[k]
		        {
		            j++;
		            k++;
		            next[j]=k;
		        }
		        else                   //p[j]!=p[k]
		            k=next[k];
		    }	
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值