KMP 字符匹配算法 java

package huawei;

public class test3 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println(KMP("bbc abcdab abcdabcdadbe", "abcdadb"));
	}

	public static int KMP(String t, String p) {
	    char[] target = t.toCharArray();
	    char[] pattern = p.toCharArray();
	    // 目标字符串下标
	    int i = 0;
	    // 搜索词下标
	    int j = 0;
	    // 整体右移一位的部分匹配表
	    int[] next = getNext(p);

	    while (i < target.length && j < pattern.length) {
	        // j == -1 表示从搜索词最开始进行匹配
	        if (j == -1 || target[i] == pattern[j]) {
	            i++;
	            j++;
	        // 匹配失败时,查询“部分匹配表”,得到搜索词位置j以前的最大共同前后缀长度
	        // 将j移动到最大共同前后缀长度的后一位,然后再继续进行匹配
	        } else {
	            j = next[j];
	        }
	    }

	    // 搜索词每一位都能匹配成功,返回匹配的的起始位置
	    if (j == pattern.length)
	        return i - j;
	    else
	        return -1;
	}
	
	/**
	* 生成部分匹配表.<br/>
	* 生成搜索词的部分匹配表<br/>
	* 
	* @param p 搜搜词
	* @return 部分匹配表
	*/
	private static int[] getNext(String pattern) {
	    char[] p = pattern.toCharArray();
	    int[] next = new int[p.length];
	  // 第一位设为-1,方便判断当前位置是否为搜索词的最开始
	    next[0] = -1;
	    int i = 0;
	    int j = -1;

	    while(i < p.length - 1) {
	        if (j == -1 || p[i] == p[j]) {
	            i++;
	            j++;
	            next[i] = j;
	        } else {
	            j = next[j];
	        }
	    }

	    return next;
	}
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值