算法——KMP初識

思想及探究看文末參考鏈接
得到next數(shù)組的代碼
(思想上的巨坑,一直理解next[0]表示的是匹配字符串第零位對應(yīng)部分匹配值,后來才發(fā)現(xiàn)next[0]表示的是第零位前面的最大匹配數(shù),所以才初始為-1)

private static int[] genNext(String p) {
        char[] chars = p.toCharArray();
        int length = p.length();
        int[] next = new int[length];

        int k = -1;
        int j = 0;
        next[0] = k;

        while (j < length - 1) {
            if (k == -1 || chars[j] == chars[k]) {
                k++;
                j++;
                if (chars[j] != chars[k]) {//對abab,abcabc等類似字符串計(jì)算next時的優(yōu)化
                    next[j] = k;
                } else {
                    next[j] = next[k];
                }
            } else {//運(yùn)用遞歸思想
                k = next[k];
            }
        }

        return next;
    }

字符串匹配代碼

private static int indexOfString(String s, String p) {
        int[] next = genNext(p);
        char[] sChars = s.toCharArray();
        char[] pChars = p.toCharArray();
        int sLen = s.length();
        int pLen = p.length();
        int i = 0, j = 0;

        while (i < sLen && j < pLen) {
            if (j == -1 || sChars[i] == pChars[j]) {
                i++;
                j++;
            } else {
                j = next[j];
            }
        }

        return j == pLen ? i - j : -1;
    }

參考鏈接

字符串匹配的KMP算法 零基礎(chǔ)可看懂
從頭到尾徹底理解KMP 從簡至深(作者重新整理過但還是有點(diǎn)亂),到擴(kuò)展BM算法和Sunday算法

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容