KMP算法Java實現

關於KMP算法的詳細介紹請戳:http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.htmlhtml

/**
 * Created by zhaoyy on 2017/2/6.
 */
public class KMPDemo {

    private static int indexOf(CharSequence sequence, CharSequence search) {
        if (sequence == null || search == null)
            return -1;
        int len1 = sequence.length();
        int len2 = search.length();
        if (len2 == 0)
            return 0;
        if (len1 == 0 || len2 > len1)
            return -1;
        int[] a = matchValues(search);
        int i = 0;
        while (i <= len1 - len2) {
            int j = 0;
            while (j < len2) {
                if (sequence.charAt(i + j) != search.charAt(j))
                    break;
                j++;
            }
            if (j == len2)
                return i;
            int next = j + 1 - a[j];
            i += next;
        }
        return -1;
    }

    private static int[] matchValues(CharSequence cs) {
        int len = cs.length();
        int[] a = new int[len];
        for (int i = 0; i < len; i++)
            a[i] = matchValue(cs, i + 1);
        return a;
    }

    private static int matchValue(CharSequence cs, int n) {
        for (int i = n - 1; i > 0; i--) {
            int j = 0;
            while (j < i) {
                if (cs.charAt(j) != cs.charAt(n - i + j))
                    break;
                j++;
            }
            if (j == i)
                return i;
        }
        return 0;
    }

    public static void main(String[] args) {
        String s1 = "ABC";
        String s2 = "BC";
        System.out.println(s1.indexOf(s2));
        System.out.println(indexOf(s1, s2));
    }
}

說明:在算「部分匹配值」的時候用了一個長度爲len2的數組作緩存用來提升性能(即查表)。java

相關文章
相關標籤/搜索