Directorio de artículos
1. Fuente del tema
Enlace: 76. Subcadena de cobertura mínima
2. Análisis de temas
Prefacio:
- [H ventana deslizante] lc30. Concatenar todas las subcadenas de palabras (ventana deslizante + hash + pensamiento)
- [M doble puntero] lc3. La subcadena más larga sin caracteres repetidos (doble puntero + hash)
Al principio escribió cnt == ht.size()
, profundizó aún más la unordered_map
comprensión. Independientemente de si está asignado o no, ¡se realizará la operación de inserción! ! Asegúrese de tener esto en cuenta.
La idea sigue siendo muy convencional, aplicando la idea de doble puntero de la tercera pregunta y una pequeña parte de la pregunta número 30 para determinar rápidamente si se cubren los caracteres de intervalo . Dos ideas muy importantes.
Código:
class Solution {
public:
string minWindow(string s, string t) {
unordered_map<char, int> hs, ht;
for (auto e : t) ht[e] ++ ;
string res;
int cnt = 0;
for (int i = 0, j = 0; i < s.size(); i ++ ) {
hs[s[i]] ++ ;// 先加入哈希表中,若加入后该字符小于等于有效字符的个数则说明该操作有效
if (hs[s[i]] <= ht[s[i]]) cnt ++ ; // 等号不能丢...一开始想错了
while (hs[s[j]] > ht[s[j]]) hs[s[j ++ ]] -- ;
if (cnt == t.size()) {
if (i - j + 1 < res.size() || res.empty())
res = s.substr(j, i - j + 1);
}
}
return res;
}
};