LeetCode (6): Prefijo común más largo

tema

Escriba una función para encontrar la cadena de prefijo común más larga en la matriz de cadenas

Ejemplo: matriz de cadenas: leets leetcode leet leeds

La cadena de prefijo común es Lee

Idea 1

1. Compara el primero con el segundo y encuentra el más largo, que es el leet
2. Compara con el siguiente, si todavía es un leet, compara la siguiente cadena; si no es un leet, quita el último dígito para obtener lee, comparar

Escriba la descripción de la imagen aquí

public String longestCommonPrefix(String[] strs) {
    if (strs.length == 0) return "";
    String prefix = strs[0];
    for (int i = 1; i < strs.length; i++)
        while (strs[i].indexOf(prefix) != 0) {
            prefix = prefix.substring(0, prefix.length() - 1);
            if (prefix.isEmpty()) return "";
        }        
    return prefix;
}

Esta idea aprende dos puntos:
1. Use la primera cadena como prefijo para comparar con la segunda cadena en lugar de comparar una por una
2. Use strs [i] .indexof (prefijo) para que sea igual a cero Como base para juzgar el prefijo, muy inteligente

Idea 2

1. Comparación longitudinal, saque la primera letra de la primera cadena y compárela con la primera de las siguientes tres cadenas, si todas son iguales, comience a comparar la segunda letra hasta que haya una desigualdad
2. Siento que este método de comparación parece tener un cursor deslizante, cuando se mueve, cuando no se cumple la condición, se interceptan los caracteres entre cero y el cursor, que es el valor que queremos.

Escriba la descripción de la imagen aquí

public String longestCommonPrefix(String[] strs) {
    if (strs == null || strs.length == 0) return "";
    for (int i = 0; i < strs[0].length() ; i++){
        char c = strs[0].charAt(i);
        for (int j = 1; j < strs.length; j ++) {
            if (i == strs[j].length() || strs[j].charAt(i) != c)
                return strs[0].substring(0, i);             
        }
    }
    return strs[0];
}
Idea 3-Divide y vencerás

Escriba la descripción de la imagen aquí

Idea: divida en dos, encuentre el prefijo más largo por separado y luego encuentre la última respuesta en los dos prefijos

  public static String longestCommonPrefix(String[] strs) {
        if (strs == null || strs.length == 0) return "";
        return longestCommonPrefix(strs, 0 , strs.length - 1);
    }

    private static String longestCommonPrefix(String[] strs, int l, int r) {
        if (l == r) {
            return strs[l];
        }
        else {
            int mid = (l + r)/2;
            String lcpLeft =   longestCommonPrefix(strs, l , mid);
            String lcpRight =  longestCommonPrefix(strs, mid + 1,r);
            return commonPrefix(lcpLeft, lcpRight);
        }
    }

     static  String  commonPrefix(String left,String right) {
        int min = Math.min(left.length(), right.length());
        for (int i = 0; i < min; i++) {
            if ( left.charAt(i) != right.charAt(i) )
                return left.substring(0, i);
        }
        return left.substring(0, min);
    }

El último código debe entenderse bien y registrarse aquí primero

Supongo que te gusta

Origin blog.csdn.net/cd18333612683/article/details/79306737
Recomendado
Clasificación