


Comment générer une combinaison de permutation qui ne se répète pas et ne fait pas de caractères identiques contigus basés sur un jeu de caractères donné et un nombre de couches?
Apr 01, 2025 am 06:18 AMEnsembles de caractères et couches: générer efficacement des permutations uniques
Cet article explore comment générer une combinaison de permutation sans doublons et sans caractères identiques consécutifs basés sur un jeu de caractères donné et un nombre de couches. Par exemple, le jeu de caractères {a, b}, la combinaison de permutation à trois couches doit contenir AAB, ABA, ABB, BAA, BAB, BBA, etc., mais pas AAA, BBB et d'autres caractères répétés consécutifs. Cela nécessite des algorithmes pour gérer la déduplication et éviter la duplication continue des caractères.
Le défi de base consiste à concevoir un algorithme qui peut s'adapter à différents jeux de caractères et couches et générer efficacement des permutations qui répondent aux critères. Cet article introduira deux méthodes: la méthode de remplacement numérique et la méthode de retournement.
Méthode 1: Méthode de remplacement numérique
Cette méthode traite la combinaison de permutation comme un numéro de chiffre M (m est la taille du jeu de caractères). Par exemple, le jeu de caractères {a, b} correspond à un numéro binaire. 00 représente AA, 01 représente AB, etc. En parcourant tous les numéros de chiffre M et en rempla?ant les caractères, vous pouvez obtenir toutes les combinaisons possibles. Pour éviter des caractères identiques continus, des nombres spécifiques à M-chiffres doivent être exclus, comme les nombres où tous les bits sont les mêmes.
Exemple de code python:
def Solve_Digit (arr, m, allow_all_same = false): res, cur = [], [''] * m n = len (arr) all_same_num = 0 pour _ dans la gamme (m): all_same_num = all_same_num * n 1 pour d dans la gamme (n ** m): Si perte_all_same ou d% all_same_num! = 0: pour I à portée (M - 1, -1, -1): cur [i] = arr [d% n] d // = n res.append (''. join (cur)) Retour Res print (solve_digit ('ab', 2)) # ['ab', 'ba'] print (solve_digit ('ab', 2, true)) # ['aa', 'ab', 'ba', 'bb'] print (solve_digit ('ab', 3)) # ['aab', 'aba', 'abb', 'baa', 'bab', 'bba'] print (solve_digit ('ABC', 2)) # ['AB', 'AC', 'BA', 'BC', 'CA', 'CB']
Méthode 2: méthode de retour en arrière
Backtrace est un algorithme récursif qui trouve des résultats en essayant toutes les combinaisons possibles. Ajoutez un caractère à la combinaison actuelle à chaque étape et génère récursivement des combinaisons plus longues. Dans le même temps, il est nécessaire de expliquer si les caractères précédents sont les mêmes pour éviter les combinaisons qui ne remplissent pas les conditions.
Exemple de code python:
def Solve_BackTracking (arr, m, allow_all_same = false): res, cur = [], [''] * m def dfs (i, même): Si i == m: Si ce n'est pas le même: res.append (''. join (cur)) Retour pour A dans Arr: cur [i] = a dfs (i 1, même et a == cur [i - 1]) pour A dans Arr: Cur [0] = A DFS (1, pas allow_all_same) Retour Res print (solve_backtracking ('ab', 2)) # ['ab', 'ba'] print (solve_backtracking ('ab', 2, true)) # ['aa', 'ab', 'ba', 'bb'] print (solve_backtracking ('ab', 3)) # ['aab', 'aba', 'abb', 'baa', 'bab', 'bba'] print (solve_backtracking ('abc', 2)) # ['ab', 'ac', 'ba', 'bc', 'ca', 'cb']
Les deux méthodes peuvent résoudre le problème. La méthode de remplacement numérique est plus efficace et la méthode de retour en arrière est plus facile à comprendre. La méthode à choisir dépend du scénario d'application spécifique et des préférences personnelles.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undress AI Tool
Images de déshabillage gratuites

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
échangez les visages dans n'importe quelle vidéo sans effort grace à notre outil d'échange de visage AI entièrement gratuit?!

Article chaud

Outils chauds

Bloc-notes++7.3.1
éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

La clé pour gérer l'authentification de l'API est de comprendre et d'utiliser correctement la méthode d'authentification. 1. Apikey est la méthode d'authentification la plus simple, généralement placée dans l'en-tête de demande ou les paramètres d'URL; 2. BasicAuth utilise le nom d'utilisateur et le mot de passe pour la transmission de codage Base64, qui convient aux systèmes internes; 3. OAuth2 doit d'abord obtenir le jeton via client_id et client_secret, puis apporter le Bearertoken dans l'en-tête de demande; 4. Afin de gérer l'expiration des jetons, la classe de gestion des jetons peut être encapsulée et rafra?chie automatiquement le jeton; En bref, la sélection de la méthode appropriée en fonction du document et le stockage en toute sécurité des informations clés sont la clé.

Pour afficher l'historique Git Commit, utilisez la commande gitlog. 1. L'utilisation de base est Gitlog, qui peut afficher le hachage de soumission, l'auteur, la date et les informations de soumission; 2. Utilisez Gitlog - Online pour obtenir une vue concise; 3. Filtre par l'auteur ou les informations de soumission via - Auteur et --Grep; 4. Ajouter -P pour afficher les modifications de code, - stat pour afficher les statistiques de changement; 5. Utilisez - GRAPH et - TOUT pour afficher l'historique de la branche, ou utiliser des outils de visualisation tels que Gitkraken et VScode.

Pour supprimer une branche GIT, assurez-vous d'abord qu'elle a été fusionnée ou aucune rétention n'est requise. Utilisez Gitbranch-D pour supprimer la branche fusionnée locale. Si vous devez forcer la suppression des branches non fusionnées, utilisez le paramètre -D. La suppression de branche à distance utilise la commande gitpushorigin-selebranch-name et peut synchroniser les référentiels locaux des autres via Gitfetch-prne. 1. Pour supprimer la branche locale, vous devez confirmer si elle a été fusionnée; 2. Pour supprimer la branche distante, vous devez utiliser le paramètre - Delete; 3. Après la suppression, vous devez vérifier si la branche est supprimée avec succès; 4. Communiquez avec l'équipe pour éviter de supprimer accidentellement des succursales partagées; 5. Nettoyez régulièrement les branches inutiles pour garder l'entrep?t propre.

Pour tester l'API, vous devez utiliser la bibliothèque des demandes de Python. Les étapes consistent à installer la bibliothèque, à envoyer des demandes, à vérifier les réponses, à définir des délais d'attente et à réessayer. Tout d'abord, installez la bibliothèque via PiPinstallRequests; Utilisez ensuite les demandes.get () ou les demandes.Post () et d'autres méthodes pour envoyer des demandes GET ou POST; Vérifiez ensuite la réponse.status_code et la réponse.json () pour vous assurer que le résultat de retour est en conformité avec les attentes; Enfin, ajoutez des paramètres de délai d'expiration pour définir l'heure du délai d'expiration et combinez la bibliothèque de réessayer pour obtenir une nouvelle tentative automatique pour améliorer la stabilité.

Dans Python, les variables définies à l'intérieur d'une fonction sont des variables locales et ne sont valides que dans la fonction; Les variables globales sont définies à l'extérieur qui peuvent être lues n'importe où. 1. Les variables locales sont détruites lors de l'exécution de la fonction; 2. La fonction peut accéder aux variables globales mais ne peut pas être modifiée directement, donc le mot-clé global est requis; 3. Si vous souhaitez modifier les variables de fonction externes dans les fonctions imbriquées, vous devez utiliser le mot-clé non local; 4. Les variables avec le même nom ne se affectent pas dans différentes lunettes; 5. Global doit être déclaré lors de la modification des variables globales, sinon une erreur non liée à la dorsale sera augmentée. Comprendre ces règles permet d'éviter les bogues et d'écrire des fonctions plus fiables.

Comment gérer efficacement les grands fichiers JSON dans Python? 1. Utilisez la bibliothèque IJSON pour diffuser et éviter le débordement de mémoire via l'analyse par éléments par éléments; 2. S'il est au format JSONLINes, vous pouvez le lire ligne par ligne et le traiter avec json.loads (); 3. Ou divisez le grand fichier en petits morceaux, puis le traitez séparément. Ces méthodes résolvent efficacement le problème de limitation de la mémoire et conviennent à différents scénarios.

Dans Python, la méthode de traverser les tuples avec des boucles pour les boucles comprend directement itérer les éléments, obtenir des indices et des éléments en même temps, et le traitement des tuples imbriqués. 1. Utilisez la boucle pour accéder directement à chaque élément de séquence sans gérer l'index; 2. Utilisez EnuMerate () pour obtenir l'index et la valeur en même temps. L'indice par défaut est 0 et le paramètre de démarrage peut également être spécifié; 3. Les tuples imbriqués peuvent être déballés dans la boucle, mais il est nécessaire de s'assurer que la structure des sous-tables est cohérente, sinon une erreur de déballage sera augmentée; De plus, le tuple est immuable et le contenu ne peut pas être modifié dans la boucle. Les valeurs indésirables peuvent être ignorées par \ _. Il est recommandé de vérifier si le tuple est vide avant de traverser pour éviter les erreurs.

Dans Python, bien qu'il n'y ait pas de mot-clé final intégré, il peut simuler des méthodes insurpassables grace à la réécriture du nom, des exceptions d'exécution, des décorateurs, etc. 1. Utilisez le préfixe de trait de soulignement pour déclencher la réécriture du nom, ce qui rend difficile les sous-classes pour écraser les méthodes; 2. Jugez le type de l'appelant dans la méthode et lancez une exception pour empêcher la redéfinition de la sous-classe; 3. Utilisez un décorateur personnalisé pour marquer la méthode comme final et vérifiez-le en combinaison avec Metaclass ou Decorator de classe; 4. Le comportement peut être encapsulé en tant qu'attributs de propriété pour réduire la possibilité d'être modifiés. Ces méthodes offrent différents degrés de protection, mais aucun d'entre eux ne restreint complètement le comportement de couverture.
