La fenêtre coulissante est une technique algorithmique utilisée pour résoudre des problèmes liés aux chaînes ou aux tableaux. Il résout le problème en conservant une fenêtre qui peut être une fenêtre de taille fixe ou une fenêtre de taille variable sur la structure de données, puis en faisant glisser la position de début ou de fin de la fenêtre dans la structure de données.
Les algorithmes à fenêtre glissante conviennent généralement aux types de problèmes suivants :
- Problème de sous-chaîne ou de sous-tableau : recherchez la sous-chaîne ou le sous-tableau continu le plus long qui satisfait une certaine condition.
- Problème de fréquence des caractères ou des nombres : comptez la fréquence ou le nombre de caractères ou de chiffres dans une fenêtre donnée.
L'idée principale de l'algorithme de fenêtre coulissante est de réduire efficacement l'espace de recherche du problème en ajustant la position de départ et la position de fin de la fenêtre. Il traite à chaque fois un nouvel élément ou caractère en déplaçant la fenêtre pour obtenir le résultat souhaité.
Les étapes spécifiques sont les suivantes :
- Initialisez les positions de début et de fin de la fenêtre.
- Commencez à parcourir la chaîne ou le tableau et effectuez les opérations appropriées en fonction des exigences de la question.
- Lorsque certaines conditions de la fenêtre sont remplies, les résultats sont mis à jour ou les informations sont enregistrées.
- Déplacez la position de début ou de fin de la fenêtre pour redimensionner la fenêtre.
- Répétez les étapes 2 à 4 jusqu'à ce que la totalité de la chaîne ou du tableau ait été parcourue.
Les algorithmes de fenêtre glissante peuvent souvent résoudre des problèmes de complexité temporelle O(n) car chaque élément ou caractère est traité au plus deux fois (en entrant dans la fenêtre et en sortant de la fenêtre) sans qu'il soit nécessaire d'effectuer une recherche globale pour chaque élément.
La fenêtre coulissante est une technique d'algorithme efficace et couramment utilisée qui peut être appliquée à une variété de problèmes, en particulier pour les problèmes de sous-chaînes ou de sous-réseaux et les problèmes de statistiques de fréquence.
Par exemple : une question algorithmique plus classique :
Étant donné une chaîne s, veuillez trouver la longueur de la sous-chaîne la plus longue qui ne contient pas de caractères répétés.
Implémentation du code JAVA :
import java.util.HashMap;
class Solution {
public int lengthOfLongestSubstring(String s) {
int n = s.length();
int maxLen = 0;
int start = 0;
HashMap<Character, Integer> map = new HashMap<>();
for (int end = 0; end < n; end++) {
char c = s.charAt(end);
if (map.containsKey(c) && map.get(c) >= start) {
start = map.get(c) + 1;
}
map.put(c, end);
maxLen = Math.max(maxLen, end - start + 1);
}
return maxLen;
}
}