leetcode.1002. Encuentra caracteres comunes

leetcode.1002. Encuentra caracteres comunes

Dada una matriz de cadenas A que consta solo de letras minúsculas, devuelve una lista de todos los caracteres (incluidos los caracteres repetidos) que se muestran en cada cadena de la lista. Por ejemplo, si un carácter aparece 3 veces en cada cadena, pero no 4 veces, debe incluir el carácter 3 veces en la respuesta final.

Puede devolver las respuestas en cualquier orden.

Ejemplo 1:

输入:["bella","label","roller"]
输出:["e","l","l"]

Ejemplo 2:

输入:["cool","lock","cook"]
输出:["c","o"]

rápido:

1 <= A.length <= 100
1 <= A[i].length <= 100
A[i][j] 是小写字母

Codigo 1

Esta pregunta puede entenderse como encontrar la intersección del número de caracteres entre cada cadena. Tome el ejemplo 1 como ejemplo:

输入:["bella","label","roller"]
输出:["e","l","l"]

Sabemos que la lista del número de caracteres en la primera cadena es:

b 1
e 1
l 2
a 1

La lista de la cantidad de caracteres en la segunda cadena es:

l 2
a 1
b 1
e 1

La lista de la cantidad de caracteres en la tercera cadena es:

r 2
o 1
l 2
e 1

El resultado de estas tres intersecciones es:

e 1
l 2

Los resultados son claros de un vistazo.

De hecho, no hay nada que decir en este momento. Podemos usar hashmap para representar la relación entre caracteres y números . Sin embargo, considerando la eficiencia, podemos usar matrices para optimizar el código. Use el subíndice i de la matriz res para indicar qué carácter es, y use res [i] para indicar el número de veces que aparece el carácter. el código se muestra a continuación:

public List<String> commonChars(String[] A) {
    
    
    List<String> list = new ArrayList<>();
    int[] res = new int[26];
    //统计第一个字符串,字符与数量的关系
    for (char c : A[0].toCharArray()) {
    
    
        res[c - 'a']++;
    }
    for (int i = 1; i < A.length; i++) {
    
    
        int[] temp = new int[26];
        //统计第 i 个字符串,字符与数量的关系
        for (char c : A[i].toCharArray()) {
    
    
            temp[c - 'a']++;
        }
        //比较第最小出现次数,结果放入res保存。
        for (int j = 0; j < 26; j++) {
    
    
            res[j] = Math.min(res[j], temp[j]);
        }
    }
    for (int i = 0; i < res.length; i++) {
    
    
        if (res[i] > 0) {
    
    
            for (int j = 0; j < res[i]; j++) {
    
    
                list.add(((char) ('a' + i) + ""));
            }
        }
    }
    return list;
}

Transferencia desde-1002. Encuentra caracteres comunes

Codigo 2

Tampoco es necesario contar el primer carácter, la relación carácter-cantidad , construimos una matriz de longitud 26, cada elemento en ella es el valor máximo de un entero de tipo int, y luego comparamos esta matriz con la cadena. Figura.
Inserte la descripción de la imagen aquí
Después de leer esta imagen, puede que le resulte extraño que aaparezca aquí , pero el resultado no se imprime, porque hay tiempos en rolleresta cadena .a0

class Solution {
    
    
    public List<String> commonChars(String[] A) {
    
    
        int[] minfreq = new int[26];
        Arrays.fill(minfreq, Integer.MAX_VALUE);
        for (String word: A) {
    
    
            int[] freq = new int[26];
            int length = word.length();
            for (int i = 0; i < length; ++i) {
    
    
                char ch = word.charAt(i);
                ++freq[ch - 'a'];
            }
            for (int i = 0; i < 26; ++i) {
    
    
                minfreq[i] = Math.min(minfreq[i], freq[i]);
            }
        }

        List<String> ans = new ArrayList<String>();
        for (int i = 0; i < 26; ++i) {
    
    
            for (int j = 0; j < minfreq[i]; ++j) {
    
    
                ans.add(String.valueOf((char) (i + 'a')));
            }
        }
        return ans;
    }
}

oficial

Supongo que te gusta

Origin blog.csdn.net/e891377/article/details/109068229
Recomendado
Clasificación