Dada una cadena, ¿encuentra la longitud de la subcadena más larga donde ningún personaje se repite dos veces?

Pregunta de entrevista famosa de hoy en día. Aquí está el algoritmo

Método 1: Algoritmo ingenuo
Verifique si cada subcadena tiene caracteres repetidos. De lo contrario, verifique si es la subcadena más larga o no.
Complejidad del tiempo: O (n ^ 3)
Complejidad espacial: O (1)

Método 2: Algoritmo de tiempo lineal
1. Cree una matriz charIndexes que tenga el último índice de caracteres de cadena visto en la cadena, inicializado a -1
2. Atraviese la matriz y compruebe si el carácter actual se vio anteriormente en la submatriz actual, si no se ve, incremente el índice de la subcadena no repetida actual vista hasta ahora (currLength).
3. Si el carácter actual es un carácter repetido y la longitud de la subcadena más larga (maxLength) vista hasta ahora es menor que la longitud actual, actualice maxLength.
Complejidad del tiempo: O (n)
Complejidad espacial: O (1)

clase pública LongestSubstring {

// Algoritmo ingenuo para encontrar la subcadena más larga sin repetir caracteres
// Complejidad cuadrática del tiempo
Cadena estática pública getLongestSubstringNonRepeatingCharsNaive (String str) {
String longestSubstring = “”;
for (int i = 0; i <str.length (); i ++) {
for (int j = i; j <str.length (); j ++) {
if (hasRepeatingChars (str, i, j)) {
rotura;
} else if (longestSubstring.length () <j-i + 1) {
longgestSubstring = str.substring (i, j + 1);
}
}
}
volver más larga
}

private static boolean hasRepeatingChars (String str, int start, int end) {
boolean [] isCharPresent = new boolean [256];
para (int i = 0; i <256; i ++) {
isCharPresent [i] = falso;
}
for (int i = start; i <= end; i ++) {
if (isCharPresent [str.charAt (i)]) {
volver verdadero;
} más {
isCharPresent [str.charAt (i)] = verdadero;
}
}
falso retorno;
}

// Algoritmo de tiempo lineal para encontrar la subcadena más larga sin repetir caracteres
Cadena estática pública getLongestSubstringNonRepeatingChars (String str) {

if (str == null) {
volver nulo;
}

int n = str.length ();
si (n <2) {
volver str;
}

// matriz para almacenar el último índice de caracteres de cadena visto en la cadena, inicializado a -1
int [] charIndexes = new int [256];
para (int i = 0; i <n; i ++) {
charIndexes [i] = -1;
}

// Establecer índice del primer carácter
charIndexes [str.charAt (0)] = 0;

int currLength = 1; // Longitud de la subcadena actual no repetida
int maxLength = 1; // Longitud de la subcadena más larga con caracteres no repetidos encontrados
int prevIdx = 0; // índice anterior del personaje actual
int startIdx = 0; // Índice inicial de la subcadena más larga con caracteres no repetidos encontrados

para (int i = 1; i <n; i ++) {
prevIdx = charIndexes [str.charAt (i)];
if (prevIdx == -1 || i – currLength> prevIdx) {
currLength ++;
} más {
if (currLength> maxLength) {
maxLength = currLength;
startIdx = i – maxLength;
}
currLength = i – prevIdx;
}
charIndexes [str.charAt (i)] = i;
}

// Comprueba si la subcadena más larga con caracteres no repetidos termina al final de la cadena
if (currLength> maxLength) {
maxLength = currLength;
startIdx = n – maxLength;
}

return str.substring (startIdx, startIdx + maxLength);
}

public static void main (String [] args) {
String str = “ABCDABDEFGCABD”;
/ * String longestSubstring = getLongestSubstringNonRepeatingCharsNaive (str);
System.out.println (“Caracteres no repetidos de subcadena más largos por método Naive: \ t \ t” + longestSubstring); * /
String longestSubstring = getLongestSubstringNonRepeatingChars (str);
System.out.println (“Caracteres no repetitivos de subcadena más largos por método de tiempo lineal: \ t” + más largoString)

}
}

Créditos: la subcadena más larga con caracteres no repetidos
Verifique la visualización del algoritmo en la página web, es genial ver que el algoritmo se ejecuta y se anima sobre la marcha.

Este problema puede expresarse en otras palabras como “la subcadena más larga sin repetir caracteres”.
Se puede resolver en O (n) complejidad de tiempo y O (n) complejidad de espacio.
Se puede utilizar un enfoque de ventana deslizante.
Realice un seguimiento de los caracteres que se visitan en la cadena temporal actual (ventana deslizante) utilizando una matriz visitada.
Deje maxlen denota la longitud máxima actual de la subcadena requerida.
Una vez que se encuentra un carácter repetitivo, deténgase allí, encuentre la longitud de la cadena temporal (incluida en la ventana deslizante actual). Si es mayor que maxlen, actualice maxlen.
Anote también el índice inicial y final de la subcadena más larga actual sin caracteres de repetición.
Ahora deslice de nuevo al siguiente índice de la instancia anterior del carácter repetido. Actualice también la matriz visitada con respecto a la nueva ventana deslizante y continúe con los mismos pasos mencionados anteriormente.

Aquí está el código con comentarios detallados.

#define REP (i, n) para (int i = 0; i #define FOR (i, st, end) for (int i = st; i #define db (x) cout << (#x) << "=" << x << endl;
#define mp make_pair
#define pb push_back
typedef long long int ll;
string longestsubstr (string str) {
int n = str.size ();
int i = 0, j = 0;
int longstart = 0, longend = 0; // puntero de inicio y fin de la subcadena más larga
bool visitado [300] = {0}; // tiene una matriz visitada para verificar si el personaje ya ha sido visitado
int maxlen = -999; // subcadena de longitud máxima actual sin repetir caracteres.
// i es el puntero de inicio de la subcadena temporal y j es el puntero de fin de la subcadena temporal
// atraviesa la cadena hasta que encuentres un personaje que se repite
mientras que (j if (visitado [str [j]]) {// si el personaje ya ha sido visitado
if (ji> maxlen) {// if ji es mayor que maxlen hasta ahora
maxlen = ji; // hacer ji como
inicio largo = i;
longend = j-1;
}
// Esta es una parte muy importante del algoritmo que hace que esta lógica sea lineal en el tiempo
// si el carácter repetido se encuentra en j significa que el mismo carácter se encuentra en alguna parte
// tener una iteración con i como variable de índice e iterar hasta que se encuentre el carácter str [j]. Esto se encontrará en un índice while (str [i]! = str [j]) {
visitado [str [i]] = falso;
i ++;
}
// si piensas intuitivamente sabrás que todas las subcadenas que comienzan antes o al
// así que continúa buscando la subcadena más larga apuntando la cabeza a i + 1
// ya que hemos procesado hasta el índice j ahora. incremento j.
i ++;
j ++;
}
else {// si el personaje aún no se visita
visitado [str [j]] = verdadero;
j ++;
}
}
// Esta parte también es importante. Cuando j alcanza ny el ciclo se rompe, la subcadena con longitud ni es otro candidato para
// subcadena más larga
if (ni> maxlen) {
maxlen = ni;
inicio largo = i;
longend = n-1;
}
return str.substr (inicio largo, maxlen);
}
int main () {
int t;
cuerda s;
scanf (“% d”, & t);
mientras que (t -) {
cin >> s;
cout << longestsubstr (s) << endl;
}
}

puede encontrarlo en el tiempo O (n) usando la Programación dinámica. Mientras itera, verifique la última aparición de un carácter en particular. una implementación fácil es http://ideone.com/Xy7juP

More Interesting

¿Qué significa el lenguaje interpretado en términos simples?

¿Cómo es estar en una entrevista técnica?

¿Se hacen con frecuencia preguntas sobre patrones de diseño durante las entrevistas de codificación en grandes empresas tecnológicas como Google y Amazon?

¿Cómo cambiaría los elementos (en su lugar) de una matriz como [A1, A2, A3, A4, B1, B2, B3, B4] para convertirlo en [A1, B1, A2, B2, A3, B3, A4, B4 ]?

¿Cuáles son algunos que deben saber las preguntas y respuestas de entrevistas específicas de Python?

¿Cuáles son los elementos comunes entre dos matrices de tamaño n y m? ¿Cuál es el tiempo y la complejidad de la memoria?

¿Cuáles son los temas en mecánica de los cuales se hacen preguntas en la entrevista NPCIL?

¿Qué empresas o startups debo solicitar para una pasantía?

Tengo muchos problemas al programar programas (errores, cosas que no funcionan como quiero, etc.), ¿por qué es esto?

¿Cómo es una entrevista en Adobe?

¿Cuáles son las preguntas más frecuentes en ASP.NET en una entrevista y cuáles se pueden preguntar si uno ha creado un sitio web universitario como parte de un proyecto?

¿Cuáles son las preguntas que uno podría esperar al entrevistar para un rol de "Evangelista de plataforma de desarrollador" en Microsoft?

Para las entrevistas en el campus, ¿por qué las empresas realizan entrevistas de codificación en línea en HackerRank o CodeChef?

Cómo estar bien preparado para responder algoritmos y estructuras de datos en una entrevista de Google

¿Cómo puede un ingeniero de ECE aclarar la ronda de entrevistas técnicas?