Pensando en la ventana corrediza de la escuela privada

La esencia del algoritmo de ventana deslizante es mantener una ventana de modo que el valor en la ventana cumpla con los requisitos del título. Se utiliza principalmente para resolver el problema del subelemento de la matriz / cadena. El problema del bucle anidado puede convertirse en un problema de bucle único, reduciendo así el tiempo y la complejidad.

A continuación, explicamos cómo utilizar la ventana deslizante para resolver el problema y sus pensamientos a través de temas específicos.

tema

LeetCode3. La subcadena más larga sin caracteres repetidos

imagen

Ideas

La complejidad temporal de la solución violenta es relativamente alta, alcanzando O (n ^ 2) , por lo que se adopta el método de ventana deslizante para reducir la complejidad temporal.

  • Defina un almacenamiento de estructura de datos de mapa (k, v), donde el valor clave es un carácter y el valor del valor es la posición del carácter + 1, sumando 1 significa que la posición del carácter no se repite hasta la siguiente posición del carácter y el mapa se actualiza constantemente durante el proceso transversal. Haga que su valor sea +1 en la posición de la última aparición.

  • Definimos la posición inicial de la subcadena no repetida como inicio y la posición final como final

  • A medida que el final continúa atravesando hacia atrás, se encontrará con la misma situación que los personajes en el mapa. En este momento, hay dos situaciones, una es que la posición del mismo personaje está en nuestra ventana deslizante y la otra es que el posición del mismo carácter no está en nuestra ventana deslizante.

    • Si el mismo carácter está en nuestra ventana deslizante, es decir, inicio <map.get (mismo carácter), necesitamos actualizar nuestro inicio
    • Si el mismo carácter no está en nuestra ventana deslizante, es decir, inicio> map.get (mismo carácter), no necesitamos actualizar nuestra estadística
  • Es decir, start = max (start, map.get (mismo carácter))

  • En este punto, podemos asegurarnos de que no haya elementos duplicados entre nuestro inicio y final.

Código

  public int lengthOfLongestSubstring(String s) {
            int n = s.length(), ans = 0;
            Map<Character, Integer> map = new HashMap<>();
            for (int end = 0, start = 0; end < n; end++) {
                char alpha = s.charAt(end);
                if (map.containsKey(alpha)) {
                    start = Math.max(map.get(alpha), start);
                }
                ans = Math.max(ans, end - start + 1);
                map.put(s.charAt(end), end + 1);
            }
            return ans;
        }

para resumir

La clave del problema de las ventanas deslizantes radica en determinar los límites del deslizamiento hacia la izquierda y hacia la derecha, y cuando la ventana se contrae es el punto clave.

Por fin

  • Si siente que ha sido recompensado después de leerlo, espero que me apruebe. Esta será la mayor motivación para actualizar. Gracias por su apoyo.
  • Bienvenidos a todos para que presten atención a mi cuenta pública [Java Fox], enfocándome en los conocimientos básicos de Java y la computadora, prometo dejarles obtener algo después de leerlo, si no me creen, péguenme
  • Si tiene diferentes opiniones o sugerencias después de leer, por favor comente y comparta con nosotros. Gracias por su apoyo y cariño.

——Soy Chuhu, y amo la programación tanto como a ti.

imagen

Supongo que te gusta

Origin blog.csdn.net/issunmingzhi/article/details/111286112
Recomendado
Clasificación