Categorías
Algorithms

LeetCode: subcadena más larga sin caracteres repetidos (Java)

Dada una cadena, encuentre la longitud de la subcadena más larga sin caracteres repetidos. Por ejemplo, la subcadena más larga sin letras repetidas para «abcabcbb» es «abc», cuya longitud es 3. Para «bbbbb», la subcadena más larga es «b», con la longitud de 1.

Análisis

La idea básica para resolver este problema es utilizar una estructura de datos adicional para rastrear los caracteres únicos en una ventana deslizante. Tanto una matriz como un conjunto de hash funcionan para este propósito.

Solución Java 1

La primera solución es como el problema de «determinar si una cadena tiene todos los caracteres únicos» en CC 150. Podemos usar una matriz de banderas para rastrear los caracteres existentes para la subcadena más larga sin caracteres repetidos.

public int lengthOfLongestSubstring(String s) {
        if(s==null)
            return 0;
	boolean[] flag = new boolean[256];
 
	int result = 0;
	int start = 0;
	char[] arr = s.toCharArray();
 
	for (int i = 0; i < arr.length; i++) {
		char current = arr[i];
		if (flag[current]) {
			result = Math.max(result, i - start);
			// the loop update the new start point
			// and reset flag array
			// for example, abccab, when it comes to 2nd c,
			// it update start from 0 to 3, reset flag for a,b
			for (int k = start; k < i; k++) {
				if (arr[k] == current) {
					start = k + 1; 
					break;
				}
				flag[arr[k]] = false;
			}
		} else {
			flag[current] = true;
		}
	}
 
	result = Math.max(arr.length - start, result);
 
	return result;
}
  LeetCode - Número más grande (Java)

Solución Java 2 – HashSet

Usar un HashSet puede simplificar mucho el código.

/*
  pwwkew
i | 
j |
 
i |
j   |
 
i   |
j   |
 
*/
public int lengthOfLongestSubstring(String s) {
    if(s==null||s.length()==0){
        return 0;
    }
 
    HashSet<Character> set = new HashSet<>();
    int result = 1;
    int i=0; 
    for(int j=0; j<s.length(); j++){
        char c = s.charAt(j);
        if(!set.contains(c)){
            set.add(c);
            result = Math.max(result, set.size());
        }else{
            while(i<j){
                if(s.charAt(i)==c){
                    i++;
                    break;
                }
 
                set.remove(s.charAt(i));
                i++;
            }
        }    
    }
 
    return result;
}

Por Programación.Click

Más de 20 años programando en diferentes lenguajes de programación. Apasionado del code clean y el terminar lo que se empieza. ¿Programamos de verdad?

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *