经典的KMP算法

 

//KMP算法(手写大名鼎鼎的kmp)经典的KMP算法时间复杂度为O(m+n)
public class kmp{
	
    //kmp算法查找是否匹配
    public static int getIndexOf(String s,String m)
    {
    	 if(s==null||m==null||m.length()<1||s.length()<m.length())
    	 {
    	 	 return -1;
    	 }
    	 char[]ss=s.toCharArray();  //字符串转换为数组
    	 char[]ms=m.toCharArray();
    	 int si=0;
    	 int mi=0;
    	 int[]next=getNextArray(ms); //获得next数组
    	 while(si<ss.length&&mi<ms.length)
    	 {
    	 	 if(ss[si]==ms[mi])
    	 	 {
    	 	 	si++;
    	 	 	mi++;
    	 	 }else if(next[mi]==-1)
    	 	 {
    	 	 	si++;
    	 	 }else{
    	 	 	mi=next[mi];
    	 	 }
    	 }
    	 return mi==ms.length?si-mi:-1;

    }

    public static int[]getNextArray(char[]ms)
    {
     	if(ms.length==1)
     	{
     		 return new int[]{-1};
     	}
     	int []next=new int[ms.length];
     	next[0]=-1;
     	next[1]=0;
     	int pos=2; //当前所指位置
     	int cn=0;
     	while(pos<next.length)
     	{
             if(ms[pos-1]==ms[cn])
             {
             	next[pos++]=++cn;
             }else if(cn>0)
             {
             	cn=next[cn];
             }else
             {
             	  next[pos++]=0;
             }
     	}

        return next;
    } 
	 public static void main(String[]args)
	 { 
	 	String s="abcdef"; //主串
	 	String t="cde";    //模式串
	 	System.out.println(getIndexOf(s,t));
          
	 }
}

                next[cn]表示它之前字符串(cn-1个字符)的最大匹配长度

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值