[Algoritmo] Ejemplo de implementación del algoritmo KMP en Java

El siguiente es un código de muestra para implementar el algoritmo KMP en Java:

public class KMPAlgorithm {
    
    

    public static void main(String[] args) {
    
    
        String pattern = "abc";
        String text = "abcdefabcghi";
        int[] lps = computeLPSArray(pattern);
        int index = search(text, pattern, lps);
        if (index != -1) {
    
    
            System.out.println("Pattern found at index " + index);
        } else {
    
    
            System.out.println("Pattern not found");
        }
    }

    public static int[] computeLPSArray(String pattern) {
    
    
        int[] lps = new int[pattern.length()];
        int len = 0;
        int i = 1;
        lps[0] = 0; // lps[0] is always 0
        // the loop calculates lps[i] for i = 1 to pattern.length()-1
        while (i < pattern.length()) {
    
    
            if (pattern.charAt(i) == pattern.charAt(len)) {
    
    
                len++;
                lps[i] = len;
                i++;
            } else {
    
    
                if (len != 0) {
    
    
                    len = lps[len - 1];
                } else {
    
    
                    lps[i] = 0;
                    i++;
                }
            }
        }
        return lps;
    }

    public static int search(String text, String pattern, int[] lps) {
    
    
        int i = 0; // index for text
        int j = 0; // index for pattern
        while (i < text.length()) {
    
    
            if (text.charAt(i) == pattern.charAt(j)) {
    
    
                i++;
                j++;
            } else {
    
    
                if (j != 0) {
    
    
                    j = lps[j - 1];
                } else {
    
    
                    i++;
                }
            }
            if (j == pattern.length()) {
    
    
                return i - j; // found at index i-j, where j is the length of pattern
            }
        }
        return -1; // not found
    }
}

En el código anterior, primero calculamos la matriz de cadenas de patrón de prefijo y sufijo común (LPS) más larga utilizando el método ComputeLPSArray(). Este método calcula la longitud del prefijo y sufijo común más largo para cada posición. Luego, buscamos la cadena de texto para la cadena de patrón usando el método search(). Este método utiliza una matriz LPS para omitir comparaciones innecesarias, mejorando así la eficiencia de la búsqueda. Si se encuentra la cadena de patrón, se devuelve su índice dentro de la cadena de texto; de lo contrario, se devuelve -1.

Supongo que te gusta

Origin blog.csdn.net/qq_22744093/article/details/132471058
Recomendado
Clasificación