Restauration d'adresses IP et génération de sous-ensembles

Restauration d'adresses IP valides

La reconstruction d'adresses IP à partir d'une chaîne numérique nécessite une approche de partitionnement avec validation. Une adresse IP valide doit contenir exactement quatre segments, chaque segment étant un entier entre 0 et 255 sans zéro non significatif.

Exemples d'adresses valides : "192.168.1.1", "10.0.0.1"
Exemples d'adresses invalides : "192.168.001.1", "256.0.0.1"

Implémentation par backtracking


class SolutionIP:
    def reconstruire_adresses_ip(self, chaine: str) -> List[str]:
        resultats = []
        segments = []
        
        def est_valide(segment: str) -> bool:
            if not segment:
                return False
            if segment[0] == '0' and len(segment) > 1:
                return False
            valeur = int(segment)
            return 0 <= valeur <= 255
        
        def explorer(debut: int):
            if len(segments) == 3:
                segment_final = chaine[debut:]
                if est_valide(segment_final):
                    adresse = ".".join(segments) + "." + segment_final
                    resultats.append(adresse)
                return
            
            for fin in range(debut, min(debut + 3, len(chaine))):
                segment_courant = chaine[debut:fin+1]
                if est_valide(segment_courant):
                    segments.append(segment_courant)
                    explorer(fin + 1)
                    segments.pop()
        
        explorer(0)
        return resultats

Génération de tous les sous-ensembles

Le problème de génération de sous-ensembles consiste à produire toutes les combinaisons possibles d'éléments d'un tableau, y compris l'ensemble vide et l'ensemble complet.

Approche exhaustive


class SolutionSousEnsembles:
    def generer_sous_ensembles(self, elements: List[int]) -> List[List[int]]:
        sous_ensembles = []
        courant = []
        
        def generer(depart: int):
            sous_ensembles.append(courant.copy())
            if len(courant) == len(elements):
                return
            
            for i in range(depart, len(elements)):
                courant.append(elements[i])
                generer(i + 1)
                courant.pop()
        
        generer(0)
        return sous_ensembles

Sous-ensembles avec éléments dupliqués

Lorsque le tableau contient des doublons, il est nécessaire d'éviter la génération de sous-ensembles identiques.

Solution avec élimination des doublons


class SolutionSousEnsemblesDupliques:
    def sous_ensembles_sans_doublons(self, elements: List[int]) -> List[List[int]]:
        sous_ensembles = []
        selection = []
        elements.sort()
        
        def explorer(index_depart: int):
            sous_ensembles.append(selection.copy())
            
            for i in range(index_depart, len(elements)):
                if i > index_depart and elements[i] == elements[i-1]:
                    continue
                selection.append(elements[i])
                explorer(i + 1)
                selection.pop()
        
        explorer(0)
        return sous_ensembles

Étiquettes: backtracking adresse IP sous-ensembles Python algorithmes

Publié le 8 septembre à 15h56