¡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
-
Este problema es un problema típico del algoritmo "Ventana de tiempo deslizante".
-
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.
- Finalmente, ans se usa para guardar la longitud máxima de la subcadena, y luego la comparación
rk - i + 1
es 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):