No repetir subcadena más larga

Uno, Título Descripción

Dada una cadena, se entera de que no contiene un carácter repetido más larga subcadena de longitud.

Ejemplo 1:

De entrada: "abcabcbb"
de salida: 3
Explicación: Debido a que la subcadena más larga de caracteres sin repetición es "abc", por lo que su longitud es de 3.

Ejemplo 2:

De entrada: "bbbbb"
de salida: 1
Explicación: Debido a que la subcadena más larga se repite sin caracteres "b", por lo que su longitud es 1.

Ejemplo 3:

De entrada: "bbbbb"
de salida: 1
Explicación: Debido a que la subcadena más larga se repite sin caracteres "b", por lo que su longitud es 1.

En segundo lugar, la solución

Hay dos ideas:

1, el método de la violencia: el uso de un bucle anidado para que coincida con uno a uno, la complejidad de tiempo es O (n * n), la complejidad espacial es O (n)

2, el método de ventana deslizante : cuando hay una repetición de las veces, entonces no puede utilizar que los caracteres que se repiten ya grabada, y para que se mueve a su uno trasero [volcado imagen eslabón exterior falla, la estación de origen puede tener mecanismo cadena antirrobo, se recomienda guardar las fotos subidas directamente hacia abajo (img-SldKCMXl-1584791396069) ( C: \ Users \ dell \ AppData \ Roaming \ typora \ typora-user-images \ imagen 20200319230634286.png)]

Si el carácter c es la aparición de la repetición, ponemos un puntero a la siguiente, a continuación, la subcadena seguro de que no se repetirá hasta que el primero del próximo c posible eliminar la duplicación.

Recuérdese a sí mismo: ventana deslizante no tiene que poner un puntero a la ubicación especificada, se puede ver en lo que se mueva! ! !

2.1 Ley de Violencia

class Solution {
    public int lengthOfLongestSubstring(String s) {
        int[] char_num;	//保存字符出现的次数
        int max = 0, temp = 0;

        for(int i = 0; i < s.length(); i++) {
            temp = 0;
            char_num = new int[128];	//ASCLL 的字符集有 128 种
            for(int j = i; j < s.length(); j++) {
                int index = s.charAt(j);
                if(char_num[index] == 0){
                    char_num[index]++;
                    temp++;
                    max = (temp > max) ? temp : max;
                } else break;
                
            }
        }

        return max;
    }
}

//官方已经说明暴力解法会超时,但他们是使用 hashset 来求解的,我用数组并没有超时

2.2 ventana deslizante

Ⅰ, usando conjunto

class Solution {
    public int lengthOfLongestSubstring(String s) {
        int max = 0, temp = 0, i = 0, j = 0;
        int length = s.length();
        Set<Character> set = new HashSet<>();	//滑动窗口的 set 解法


        //用窗口来进行优化
        while(i < length && j < length) {
        	//窗口是一个 [start, end],则 j 是 end,i 是start
            if(!set.contains(s.charAt(j))) {
                set.add(s.charAt(j));
                j++;
                max = (j - i > max) ? j - i : max;
            } else {	//移动 start,是一步一步移动的!
                set.remove(s.charAt(i));
                i++;
            }

        }

        return max;
    }
}

Ⅱ, usando una matriz (barril)

class Solution {
    public int lengthOfLongestSubstring(String s) {
        int[] char_num = new int[128];
        int length = s.length();
        int i =0, j = 0, max = 0;
        
        while(i < length && j < length) {
            if(char_num[s.charAt(j)] == 0) {	//j 指针指向的字符在数组中如果表示为 0
                char_num[s.charAt(j)]++;
                j++;
                max = (j - i > max) ? j - i : max;
                
            } else {
                char_num[s.charAt(i)] = 0;	//把 i 指针指向的字符在数组中清除掉
                i++;
            }
        }
        
        return max;
    }
}
Publicado 42 artículos originales · ganado elogios 3 · Vistas 2056

Supongo que te gusta

Origin blog.csdn.net/stable_zl/article/details/105015929
Recomendado
Clasificación