ホームページ >Java >&#&チュートリアル >Javaを使用してKMPアルゴリズムを実装する方法
Java を使用して KMP アルゴリズムを実装する方法
KMP アルゴリズム (Karp-Miller-Rosenberg アルゴリズム) は、すでに一致した情報を使用して回避する文字列一致アルゴリズムです。不要なマッチングを排除し、マッチング効率を向上させます。 KMP アルゴリズムは、大規模なテキストおよびパターン文字列のマッチングを処理する場合に効率的なアルゴリズムです。この記事では、Java を使用して KMP アルゴリズムを実装する方法を紹介し、具体的なコード例を示します。
1. KMP アルゴリズムの原理
1.1. プレフィックス関数
KMP アルゴリズムの中心的な考え方は、プレフィックス関数 (最長の共通プレフィックスおよびサフィックスとも呼ばれます) を使用してパターンを処理することです。マッチングが失敗した場合の文字列。
プレフィックス関数は配列 pi です。ここで、pi[i] は、パターンの最初の i 文字のうち、i 番目の文字で終わる文字列の最長の真の接頭辞と最長の真の接尾辞の長さを表します。弦。たとえば、パターン文字列「ababaca」の接頭辞関数は [0, 0, 1, 2, 3, 0, 1] です。
1.2. KMP アルゴリズムの主な手順
KMP アルゴリズムの主な手順は次のとおりです:
1) パターン文字列のプレフィックス関数を計算します;
2) テキスト文字列内で一致します、プレフィックス関数を使用して、一致失敗の状況を処理します。
2. KMP アルゴリズムの実装
以下では、Java を使用して KMP アルゴリズムを実装する方法を紹介します。
public class KMP { public static int[] computePrefixFunction(String pattern) { int m = pattern.length(); int[] pi = new int[m]; int k = 0; for (int i = 1; i < m; i++) { while (k > 0 && pattern.charAt(k) != pattern.charAt(i)) { k = pi[k - 1]; } if (pattern.charAt(k) == pattern.charAt(i)) { k++; } pi[i] = k; } return pi; } public static int search(String text, String pattern) { int n = text.length(); int m = pattern.length(); int[] pi = computePrefixFunction(pattern); int q = 0; for (int i = 0; i < n; i++) { while (q > 0 && pattern.charAt(q) != text.charAt(i)) { q = pi[q - 1]; } if (pattern.charAt(q) == text.charAt(i)) { q++; } if (q == m) { return i - m + 1; } } return -1; } public static void main(String[] args) { String text = "ababababacaba"; String pattern = "bac"; int index = search(text, pattern); if (index != -1) { System.out.println("Pattern found at index " + index); } else { System.out.println("Pattern not found"); } } }
上記のコードでは、computePrefixFunction 関数を使用してパターン文字列のプレフィックス関数を計算し、検索関数を使用してテキスト文字列内で一致させます。 main 関数では、検索関数を呼び出してパターン マッチングを実行し、マッチング結果を出力する方法を確認できます。
3. 概要
KMP アルゴリズムを使用すると、文字列一致操作を効果的に実行できます。この記事では、KMP アルゴリズムの原理と、Java を使用して KMP アルゴリズムを実装する方法を紹介します。この記事が KMP アルゴリズムの学習と理解に役立つことを願っています。
以上がJavaを使用してKMPアルゴリズムを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。