318. Producto de longitud máxima de palabra: Introducción clásica de "Compresión de estado + Operaciones de bits"

Llega oferta, cava amigos a recoger! Estoy participando en el evento de registro de reclutamiento de primavera de 2022, haga clic para ver los detalles del evento .

Tema Descripción

Esto es 318. Producto de longitud máxima de palabra en LeetCode con una dificultad media .

Etiqueta: "simulación", "operación de bits", "tabla hash"

Dada una matriz de cadenas  words, encuentre  yo mi norte gramo t h ( w O r D [ i ] ) l e n g t h ( w o r d [ j ] ) longitud(palabra[i]) * longitud(palabra[j])  contienen letras en comúnPuedes pensar en cada palabra que contiene solo letras minúsculas. Si no existen tales dos palabras, regrese 0 0 _

 Ejemplo 1:

输入: ["abcw","baz","foo","bar","xtfn","abcdef"]

输出: 16 

解释: 这两个单词为 "abcw", "xtfn"。
复制代码

Ejemplo 2:

输入: ["a","ab","abc","d","cd","bcd","abcd"]

输出: 4 

解释: 这两个单词为 "ab", "cd"。
复制代码

Ejemplo 3:

输入: ["a","aa","aaa","aaaa"]

输出: 0 

解释: 不存在这样的两个单词。
复制代码

insinuación:

  • 2 < = w o r d s . l e n g t h < = 1000 2 <= palabras.longitud <= 1000
  • 1 < = w o r d s [ i ] . l e n g t h < = 1000 1 <= words[i].length <= 1000
  • w o r d s [ i ] words[i]  仅包含小写字母

模拟

根据题意进行模拟即可,利用每个 w o r d s [ i ] words[i] 只有小写字母,且只需要区分两字符是否有字母重复。

我们可以使用一个 int 来代指某个 w o r d [ i ] word[i] :低 26 26 来代指字母 a-z 是否出现过。

然后对每个「字符对」所对应的两个 int 值执行 & 操作(若两字符无重复字符,则结果为 0 0 ),并得出最终答案。

代码:

class Solution {
    public int maxProduct(String[] words) {
        int n = words.length, idx = 0;
        int[] masks = new int[n];
        for (String w : words) {
            int t = 0;
            for (int i = 0; i < w.length(); i++) {
                int u = w.charAt(i) - 'a';
                t |= (1 << u);
            }
            masks[idx++] = t;
        }
        int ans = 0;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < i; j++) {
                if ((masks[i] & masks[j]) == 0) ans = Math.max(ans, words[i].length() * words[j].length());
            }
        }
        return ans;
    }
}
复制代码
  • 时间复杂度:令 n n w o r d s words 数组的长度,转换出 m a s k s masks 的复杂度为 O ( i = 0 i = n 1 w o r d s [ i ] . l e n g t h ) O(\sum_{i = 0}^{i = n - 1}words[i].length) ;得到答案的复杂度为 O ( n 2 ) O(n^2) 。整体复杂度为 O ( max ( i = 0 i = n 1 w o r d s [ i ] . l e n g t h , n 2 ) ) O(\max(\sum_{i = 0}^{i = n - 1}words[i].length, n^2))
  • 空间复杂度: O ( n ) O(n)

优化

不难发现,对于词频相同( m a s k mask 值相等)的两字符,只需要保留字符长度大的即可,因此我们可以使用「哈希表」代替 m a s k s masks 数组。

代码:

class Solution {
    public int maxProduct(String[] words) {
        Map<Integer, Integer> map = new HashMap<>();
        for (String w : words) {
            int t = 0, m = w.length();
            for (int i = 0; i < m; i++) {
                int u = w.charAt(i) - 'a';
                t |= (1 << u);
            }
            if (!map.containsKey(t) || map.get(t) < m) map.put(t, m);
        }
        int ans = 0;
        for (int a : map.keySet()) {
            for (int b : map.keySet()) {
                if ((a & b) == 0) ans = Math.max(ans, map.get(a) * map.get(b));
            }
        }
        return ans;
    }
}
复制代码
  • 时间复杂度:令 n n w o r d s words 数组的长度,得到 m a p map 的复杂度为 O ( i = 0 i = n 1 w o r d s [ i ] . l e n g t h ) O(\sum_{i = 0}^{i = n - 1}words[i].length) ;得到答案的复杂度为 O ( n 2 ) O(n^2) 。整体复杂度为 O ( max ( i = 0 i = n 1 w o r d s [ i ] . l e n g t h , n 2 ) ) O(\max(\sum_{i = 0}^{i = n - 1}words[i].length, n^2))
  • 空间复杂度: O ( n ) O(n)

finalmente

Este es el primer No.318artículo serie comienza el 01/01/2021. A partir de la fecha de inicio, hay 1916 preguntas en LeetCode, algunas de las cuales están bloqueadas. Primero pondremos todas las preguntas sin cerraduras Tema terminado.

En esta serie de artículos, además de explicar las ideas de resolución de problemas, se dará el código más conciso posible. Si se trata de soluciones generales, también se proporcionarán las plantillas de código correspondientes.

Para facilitar a los estudiantes la depuración y el envío de código en la computadora, he establecido un repositorio relacionado: github.com/SharingSour… .

En la dirección del almacén, puede ver el enlace a la solución de la serie de artículos, el código correspondiente de la serie de artículos, el enlace a la pregunta original de LeetCode y otras soluciones preferidas.

Supongo que te gusta

Origin juejin.im/post/7079961288138309645
Recomendado
Clasificación