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
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.
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 |
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