KMP算法优化

/**
 *
 * 
 *   KMP算法!
 * 
 */

public class Main2
{
	public static void main(String[] args)
	{
		String str1 = "dd1f dfdddddfdkke dfddkjlkrupieqrqekjrhjskk lkjelr';qkjrqierpeqddf1";
		String str2 = "ddf";
		char c1[] = new char[str1.length()+1];
		char c2[] = new char[str2.length()+1];
		c1[0] = (char) str1.length(); c2[0] = (char) str2.length();
		System.arraycopy(str1.toCharArray(), 0, c1, 1, c1.length-1);
		System.arraycopy(str2.toCharArray(), 0, c2, 1, c2.length-1);
		
		int result = KMP(c1, c2);
		
		if (result != -1) System.out.println("匹配成功,序号为:"+result);
		else System.out.println("匹配失败!");
	}

	private static int KMP(char[] c1, char[] c2)
	{
		int[]next = new int[c2.length];
		getNext(c2, next);
		
		int i = 1, j = 1;
		while (i <= c1[0] && j <= c2[0])
		{
			if (j == 0 || c1[i] == c2[j])
			{
				i++;
				j++;
			}
			else
				j = next[j];
		}
		
		if (j > c2[0]) return i - c2[0];
		return -1;
	}

	private static void getNext(char[] c2, int[] next)
	{
		 int start = 0, end = 1;
		 next[1] = 0;
		 
		 while(end < c2[0])
		 {
             if (start == 0 || c2[start] == c2[end])
             {
            	 start++;
            	 end++;
                 if (c2[start] != c2[end])next[end] = start;
                 else  next[end] = next[start];
             }
             else
             {
            	 start = next[start]; 
             }
		 }
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值