KMP算法(java)

9 篇文章 0 订阅

KMP算法是在字符串M中查找是否包含字符串N,存在返回字符串M匹配的字符首位置,将复杂度O(mn)降为O(m+n)

要看对KMP算法的理解,请参考字符串匹配的KMP算法

要看其中对匹配表的理解,请参考 KMP算法最浅显理解——一看就明白 

下面是基于算法整理的Java代码:

public class KMP {

	private static int[] getNext(String b) {
		int len = b.length();
		int j = 0;

		int next[] = new int[len + 1];
		next[0] = next[1] = 0;

		for (int i = 1; i < len; i++) {
			while (j > 0 && b.charAt(i) != b.charAt(j)) {
				j = next[j];
			}
			if (b.charAt(i) == b.charAt(j)) {
				j++;
			}
			next[i + 1] = j;
		}

		return next;
	}

	public static List<Integer> search(String original, String find) {
		List<Integer> pos = new ArrayList<Integer>();

		int[] next = getNext(find);

		int j = 0;
		for (int i = 0; i < original.length(); i++) {
			while (j > 0 && original.charAt(i) != find.charAt(j))
				j = next[j];
			if (original.charAt(i) == find.charAt(j)) {
				j++;
			}
				
			if (j == find.length()) {
				pos.add(i - j + 1);
				j = 0;
			}
		}

		return pos;
	}
	
	public static int searchFirst(String original, String find) {
		int pos = -1;

		int[] next = getNext(find);

		int j = 0;
		for (int i = 0; i < original.length(); i++) {
			while (j > 0 && original.charAt(i) != find.charAt(j))
				j = next[j];
			if (original.charAt(i) == find.charAt(j)) {
				j++;
			}
				
			if (j == find.length()) {
				pos = i - j + 1;
				break;
			}
		}

		return pos;
	}
	
	public static void main(String[] args) {
	    String a = "abcaabababaa";
	    String b = "abaa";
	    
	    //List<Integer> aaa = search(a, b);
	    int bbb = searchFirst(a, b);
	    
	    //System.out.println(aaa);
	    System.out.println(bbb);
    }
}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值