¿Cuál es el mejor algoritmo para encontrar la longitud de la subcadena más larga sin repetir caracteres?

Existe una solución [matemática] O (n) [/ matemática] para este problema, donde [matemática] n [/ matemática] es la longitud de la cadena que utiliza programación dinámica.

Deje [math] x_i [/ ​​math] ser la subcadena más larga que termina en el índice [math] i [/ math] sin repetición de letras.

Mientras se propaga del índice [math] i-1 [/ math] a [math] i [/ math], debemos verificar si el carácter [math] s_i [/ ​​math] existe en [math] x_ {i-1} [/mates]. Para esto, almacenaremos los índices de apariencia de cada letra. Si [math] s_i [/ ​​math] existe en [math] x_ {i-1} [/ math], [math] x_i [/ ​​math] comenzará desde el índice justo después de aparecer [math] s_i [/ ​​math] en [matemáticas] x_ {i-1} [/ matemáticas]. Si [math] s_i [/ ​​math] no existe en [math] x_ {i-1} [/ math], simplemente podemos extender [math] x_ {i-1} [/ math] a [math] x_ {i} [/ matemáticas].

[matemática] dp [i] = 1 + dp [i-1] [/ matemática], si [matemática] s [i] [/ matemática] no se encuentra en [matemática] s [i-dp ​​[i-1] : i-1] [/ math] donde [math] s [l: r] [/ math] es una subcadena de [math] s [/ math] del índice [math] l [/ math] al index [math] r [/ matemáticas] (ambos incluidos)

[math] dp [i] = ip [/ math], de lo contrario, donde [math] p [/ math] es el índice más grande menor que [math] i [/ math] tal que [math] s [p] = s [i] [/ matemáticas]