中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java中字符串匹配KMP算法怎么寫

發布時間:2021-12-20 14:48:17 來源:億速云 閱讀:138 作者:iii 欄目:大數據

這篇文章主要講解了“Java中字符串匹配KMP算法怎么寫”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Java中字符串匹配KMP算法怎么寫”吧!

暴力的字符串匹配算法很容易寫,看一下它的運行邏輯:

public class bf {    public static int search(String txt,String pat){        int sLen = txt.length();// 主字符串        int pLen = pat.length();// 模式串長度        // 需要匹配的次數        for (int i=0;i<=sLen-pLen;i++){            int j ;            // 遍歷模式串            for (j=0;j<pLen;j++){                if (pat.charAt(j)!=txt.charAt(i+j)){                    break;                }            }            // 如果j移動到模板末尾了 說明匹配成功了            if (j==pLen) return i ;        }        return -1;    }    public static void main(String[] args) {        System.out.println(search("aaacaaab","ababac"));    }}

對于暴力算法,如果出現不匹配字符,同時回退 txtpat 的指針,嵌套 for 循環,時間復雜度 $O(MN)$,空間復雜度$O(1)$。最主要的問題是,如果字符串中重復的字符比較多,該算法就顯得很蠢。

比如 txt = "aaacaaab" pat = "aaab":

KMP分為兩部分,next 數組 和 正式匹配

next 數組 部分:開一個數組next,找每個字符前的 最大相等前后綴長度,我簡單地通過舉例解釋一下這個詞:

比如 aba --> 一個前綴是 a,一個后綴是 a,最大相等前后綴長度 為 1

比如 baba --> 一個前綴是 ba,一個后綴是 ba,最大相等前后綴長度 為 2

比如 ababa --> 一個前綴是 aba,一個后綴是 aba,最大相等前后綴長度 為 3,為什么不是前綴 ababa,后綴 ababa 呢,是因為前綴不包含最后一個字符,后綴不包含第一個字符。為什么不是前綴 a 后綴 a 呢,因為盡管它們是一對相等前后綴,但它們不是 最大 相等前后綴長度

設置i j指針,i j最初位于開頭和索引為 1 的位置,分別代表前綴,后綴指針,前綴后綴串有個特點:前綴串總是從0開始,而后綴串總是相對于前綴串(不能確定開始的位置),因此每當 i j 失配時,i 就回溯到上一個位置,那 i 怎么回到上一個位置,這個地方是最難理解的:next[i] 就是 i 應該回到的位置(ps:如果你是為了考試但還不能理解,建議背下來,可以不用花時間去理解了,始終記住一回溯就是 i = next[i],如果放一堆證明公式在這里,相信肯定令人昏昏欲睡!)然后進行下一輪匹配,直到 j 走完了,next數組才算完成

正式匹配 部分:現在來討論主串與模式串的關系了,主串就是被匹配的串,模式串是要拿去匹配的其他字符串的字符串(有點拗口),通常模式串長度小于主串。用 i j 作為主串 模式串的指針,這時模式串是相對的,主串是絕對的,因為主串匹配不上就得往后走,而模式串匹配不上就得再重新匹配前面一部分,因此每當 i j 失配時,j 就回溯到上一個位置(這里的回溯同理),進行下一輪匹配,直到 j 走完了,說明匹配成功,返回 i - j,因為i - j 對應的就是匹配到的起始位置。若匹配不上的話,i 就走到結尾了,返回 -1

感謝各位的閱讀,以上就是“Java中字符串匹配KMP算法怎么寫”的內容了,經過本文的學習后,相信大家對Java中字符串匹配KMP算法怎么寫這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

蒙山县| 潞城市| 松溪县| 湘乡市| 沾化县| 手游| 叙永县| 馆陶县| 墨脱县| 枣阳市| 庆安县| 公主岭市| 新余市| 赤峰市| 宜城市| 呼玛县| 门头沟区| 格尔木市| 类乌齐县| 乐至县| 湘潭市| 邵阳县| 平和县| 岗巴县| 宜阳县| 杂多县| 涞源县| 沂水县| 深水埗区| 临澧县| 澄城县| 胶南市| 沅陵县| 霍城县| 嘉荫县| 永泰县| 衡阳市| 汨罗市| 枝江市| 沂水县| 铁力市|