91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

Java怎么實現KMP算法

發布時間:2022-02-18 10:47:13 來源:億速云 閱讀:250 作者:iii 欄目:開發技術

本篇內容主要講解“Java怎么實現KMP算法”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Java怎么實現KMP算法”吧!

KMP 算法

KMP (Knuth-Morris-Pratt), 是一種改進的字符串匹配算法. KMP 算法解決了暴力匹配需要高頻回退的問題, KMP 算法在匹配上若干字符后, 字符串位置不需要回退, 從而大大提高效率. 如圖:

Java怎么實現KMP算法

舉個例子 (字符串 “abcabcdef” 匹配字符串 “abcdef”):

次數暴力匹配KMP 算法說明
1abcabcdef abcdefabcabcdef abcdefa 和 a 匹配
2abcabcdef abcdefabcabcdef abcdefab 和 ab 匹配
3abcabcdef abcdefabcabcdef abcdefabc 和 abc 匹配
4abcabcdef abcdefabcabcdef abcdefabca 和 abcd 不匹配, 回退. 暴力匹配回退到索引 1, 即 “b”, KMP 算法索引跳置 3, 即 “a”
5abcabcdef abcdefabcabcdef abcdef暴力匹配 b 和 a 不匹配, 后移. KMP 算法 a 和 a 匹配
6abcabcdef abcdefabcabcdef abcdef暴力匹配 c 和 a 不匹配, 后移. KMP 算法 ab 和 ab 匹配
7abcabcdef abcdefabcabcdef abcdef暴力匹配 a 和 a 匹配. KMP 算法 abc 和 abc 匹配
8abcabcdef abcdefabcabcdef abcdef暴力匹配 ab 和 ab 匹配. KMP 算法 abcd 和 abcd 匹配
9abcabcdef abcdefabcabcdef abcdef暴力匹配 abc 和 abc 匹配. KMP 算法 abcde 和 abcde 匹配
10abcabcdef abcdefabcabcdef abcdef暴力匹配 abcd 和 abcd 匹配. KMP 算法 abcdef 和 abcdef 匹配 , 匹配完成
11abcabcdef abcdefabcabcdef abcdef暴力匹配 abcde 和 abcde 匹配. KMP 算法匹配完成
12abcabcdef abcdefabcabcdef abcdef暴力匹配 abcd 和 abcd 匹配, 匹配完成. KMP 算法匹配完成

部分匹配表

部分匹配表 (Partial Match Table) 指的是 “前綴” 和 “后綴” 的最長共有元素的長度.

舉個例子, 字符串 “ABCDABD” 的前綴與后綴:

字符串前綴后綴共同部分
ANaNNaNNaN0
ABABNaN0
ABCA, ABC, BCNaN0
ABCDA, AB, ABCD, CD, BCDNaN0
ABCDAA, AB, ABC, ABCDA, DA, CDA, BCDAA1
ABCDABA, AB, ABC, ABCD, ABCDAB, AB, DAB, CDAB, BCDABAB2
ABCDABA, AB, ABC, ABCD, ABCDA, ABCDABD, BD, ABD, DABD, CDABD, BCDABDNaN0

KMP 算法實現

重點:

KMP 算法中移動的位數 = 已匹配的字符數 - 對應的部分匹配值

import java.util.Arrays;

public class KMPMatch {

    public static int Match(String str1, String str2, int[] next) {

        // 初始化索引
        int i = 0;
        int j = 0;

        for (; i < str1.length(); i++) {

            if (j > 0 && str1.charAt(i) != str2.charAt(j)) {
                // 不匹配, 回退
                i = i - next[j - 1];
                j = 0;
            }

            // 匹配
            if (str1.charAt(i) == str2.charAt(j)) {
                j++;
            }

            // 返回索引
            if (j == str2.length()) {
                return i - j + 1;
            }
        }
        return -1;
    }

    // 部分匹配
    public static int[] getNext(String s) {

        // 定義數組
        int next[] = new int[s.length()];

        // 初始化i, j
        int i = 0;
        int j = -1;
        next[0] = -1;

        // 遍歷
        while (i < s.length() - 1) {
            if (j == -1 || s.charAt(i) == s.charAt(j)) {
                // 匹配成功
                next[i] = j + 1;
                i++;
                j++;
            } else {
                //一旦不匹配成功j回退到-1
                j = -1;
            }
        }
        return next;
    }


    public static void main(String[] args) {

        // 字符串1
        String str1 = "BBCABCDAB ABCDABD";

        // 字符串2
        String str2 = "ABCDABD";

        // 匹配表
        int[] next = getNext(str2);
        System.out.println(Arrays.toString(next));


        // KMP算法
        int result = Match(str1, str2, next);
        System.out.println(result);
    }
}

輸出結果:

[0, 0, 0, 0, 1, 2, 0]
10

到此,相信大家對“Java怎么實現KMP算法”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

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

AI

沽源县| 平远县| 桦甸市| 台前县| 新晃| 喀什市| 荆州市| 蚌埠市| 德州市| 松原市| 资源县| 监利县| 吴江市| 天水市| 岑巩县| 方山县| 苍山县| 石阡县| 秦安县| 杭锦后旗| 鄱阳县| 靖西县| 合川市| 克拉玛依市| 厦门市| 南丹县| 乌海市| 鸡东县| 芜湖县| 江川县| 石柱| 锦屏县| 义马市| 黑河市| 沧源| 白玉县| 合肥市| 平顺县| 南阳市| 报价| 大石桥市|