Estructura de datos y algoritmo de LeetCode para la subcadena más larga sin caracteres repetidos

¡Acostúmbrate a escribir juntos! Este es el día 11 de mi participación en el "Nuevo plan diario de Nuggets · Desafío de actualización de abril", haga clic para ver los detalles del evento .

tema

subcadena más larga sin caracteres repetidos

Dada una cadena s, encuentre la longitud de la subcadena más larga que no contiene caracteres repetidos.

Ejemplo 1:

输入: s = "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
复制代码

Ejemplo 2:

输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
复制代码

Ejemplo 3:

输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
     请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
复制代码

insinuación:

0 <= s.length <= 5 * 104
s 由英文字母、数字、符号和空格组成
复制代码

responder

análisis de resolución de problemas

Ideas para resolver problemas

  1. Este problema es un problema típico del algoritmo "Ventana de tiempo deslizante".

  2. Podemos usar el puntero rápido y lento para leer la cadena, i representa la posición inicial de la subcadena y rk representa la posición actual de la subcadena.

Podemos usar hash para determinar subcadenas que no se repiten. Si la cadena existe en la tabla hash, ingresará al siguiente bucle; si no existe, se colocará en el conjunto y luego se moverá el puntero derecho.

  1. Finalmente, ans se usa para guardar la longitud máxima de la subcadena, y luego la comparación rk - i + 1es puntero derecho - puntero izquierdo + 1

Complejidad Complejidad temporal O(N)
Complejidad espacial O(|Σ|)

código de resolución de problemas

El código de la solución es el siguiente (comentarios detallados en el código):

class Solution {
    public int lengthOfLongestSubstring(String s) {
        // hash 集合,记录每个字符串是否出现过
        Set<Character> occ = new HashSet<>();
        int n = s.length();
        // 右指针,初始值为 -1, 相当于我们字符串在左边界的左侧
        int rk = -1, ans = 0;
        for (int i = 0; i < n; i++) {
            if (i != 0) {
                // 左指针右移,删除一个字符
                occ.remove(s.charAt(i - 1));
            }
            while (rk + 1 < n && !occ.contains(s.charAt(rk + 1))) {
                // 指针右移
                occ.add(s.charAt(rk + 1));
                rk++;
            }

            // 第 i 到 rk 一个字符串是一个,最长的无重复的子串
            ans = Math.max(ans, rk - i + 1);
        }
        return ans;
    }
}
复制代码

Resultados de comentarios después del envío (debido a que este tema no ha sido optimizado, el rendimiento es promedio):

imagen.png

Informacion de referencia

Supongo que te gusta

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