zoukankan      html  css  js  c++  java
  • KMP算法(java)

    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);
        }
    }



  • 相关阅读:
    parent和top
    history
    [矩阵快速幂]T-shirt(2018江苏邀请赛I题)
    [学习]Java学习
    [数论]Factors of Factorial
    [RMQ][ST算法]Frequent values
    [二维树状数组]计数问题
    [树状数组]Mishka and Interesting sum(codeforces703D)
    [简单思维题]Snuke's Coloring 2-1
    [树状数组][逆序数]Ultra-QuickSort
  • 原文地址:https://www.cnblogs.com/dulinan/p/12033050.html
Copyright © 2011-2022 走看看