字符串匹配算法比較

最近研究算法,才發現字符串匹配居然有這麼多的算法能夠選擇,而且對字符串查找的效率也有提高,在這裏對幾個典型的算法作一個總結。各類算法的原理在全部算法書籍或者Google都能找到,這裏就再也不重複,只將本身實現的java版代碼貼下。html

簡單匹配

/**
     * 原始字符串匹配
     *
     * @param target
     * @param pattern
     * @return
     */
    public static int originMatch(String target, String pattern) {
        int flag = -1;
        int tlen = target.length();
        int plen = pattern.length();
        int i = 0, j = 0;

        while ((i + j) < tlen && j < plen) {
            if (target.charAt(i + j) == pattern.charAt(j)) {
                j++;
            } else {
                i++;
                j = 0;
            }
        }

        if (j == plen) {
            flag = i;
        }
        return flag;
    }

KMP算法匹配

/**
     * 採用KMP算法匹配字符串
     *
     * @param target
     * @param pattern
     * @return
     */
    public static int kmpMatch(String target, String pattern) {
        int flag = -1;
        char[] ps = pattern.toCharArray();
        char[] ts = target.toCharArray();
        int[] next = getNext(ps);
        int i = 0;
        int j = 0;
        while (i < ts.length && j < ps.length) {

            if (j == -1 || ps[j] == ts[i]) {
                i++;
                j++;
            } else {
//                if (next[j] == -1) {
//                    i++;
//                    j = 0;
//                } else if (next[j] == 0) {
//                    j = 0;
//                } else if (next[j] > 0) {
//                    j = next[j];
//                }
                j = next[j];
            }

        }

        if (j == ps.length) {
            flag = i - j;
        }
        return flag;
    }

    /**
     * KMP 取模式值next[n]
     *
     * @param ps
     * @return
     */
    public static int[] getNext(char[] ps) {
        int[] next = new int[ps.length];
        next[0] = -1;
        // 標記字符在字符數組中的位置
        int i = 0;
        // 標記取值模式數組的位置
        int j = -1;
        while (i < ps.length - 1) {
            if (j == -1 || ps[i] == ps[j]) {
                i++;
                j++;
                if (ps[i] != ps[j]) {
                    next[i] = j;
                } else {
                    next[i] = next[j];
                }
            } else {
                j = next[j];
            }
        }
        return next;
    }

Sunday算法匹配

/**
     * 字符串匹配之Sunday算法
     *
     * @return
     */
    public static int sundayMatch(String target, String pattern) {
        int flag = -1;
        int tlen = target.length();
        int plen = pattern.length();
        int i = 0;// 標記目標串的字符的開始位置
        int j = 0;// 標記模式串的字符位置
        int m = 0; //標記目標串匹配模式串的動態位置

        while (i < tlen && j < plen) {
            if (i == 0 && j == 0) {
                if (target.charAt(i) != pattern.charAt(j)) {
                    m = i + plen;
                    for (int k = plen - 1; k >= 0; k--) {
                        if (pattern.charAt(k) == target.charAt(m)) {
                            i = i + (plen - k);
                            break;
                        }
                    }
                }
            }
            if (target.charAt(i) != pattern.charAt(j)) {
                for (int k = (i + plen - j); k < tlen; k++) {
                    if (target.charAt(k) == pattern.charAt(plen - 1)) {
                        m = k;
                        i = m - plen + 1;
                        j = 0;
                        break;

                    }
                }
            } else {
                i++;
                j++;
            }
        }
        if (j == plen) {
            flag = i - plen;
        }
        return flag;
    }

代碼的github地址:
github地址java

留下的幾個好的參考博客:git

KMP字符串模式匹配詳解github

字符串匹配算法 – Sunday算法算法

相關文章
相關標籤/搜索