1639. Nombre de façons de former une chaîne cible à partir d'un dictionnaire
Difficulté : Difficile
Sujets :Array, String, Programmation dynamique
Vous recevez une liste de chaînes de même longueur mots et une cible de chaîne.
Votre tâche consiste à former une cible en utilisant les mots donnés selon les règles suivantes :
Avis que vous pouvez utiliser plusieurs caractères de la même chaîne dans les mots à condition que les conditions ci-dessus soient remplies.
Renvoyer le nombre de façons de former une cible à partir de mots. Puisque la réponse est peut-être trop grande, renvoyez-la modulo 1097.
Exemple 1 :
Exemple 2 :
Contraintes :
Indice :
Solution :
Le problème nécessite de trouver le nombre de façons de former une chaîne cible à partir d'un dictionnaire de mots, en suivant des règles spécifiques concernant l'utilisation des caractères. Il s'agit d'un problème combinatoire qui peut être résolu efficacement en utilisant la Programmation dynamique (DP) et le prétraitement des fréquences de caractères.
La solution utilise :
Étapes :
Implémentons cette solution en PHP : 1639. Nombre de façons de former une chaîne cible à partir d'un dictionnaire
Explication:
Étape de prétraitement :
- Créez un tableau de comptes :
- Pour chaque colonne en mots, comptez les occurrences de chaque caractère.
- Exemple : Si mots = ["acca", "bbbb", "caca"], pour la première colonne, compte[0] = {'a' : 1, 'b' : 1, 'c' : 1 }.
DP récursif :
- Définir dp(i, j) :
- i est l'index actuel dans la cible.
- j est la position actuelle dans les mots.
- Cas de base :
- Si i == len(target) : Cible entière formée → renvoyer 1.
- Si j == len(words[0]) : Plus de colonnes à utiliser → renvoie 0.
- Récidive :
- Option 1 : utilisez les caractères count[j][target[i]] à partir de la position j.
- Option 2 : Sauter la position j.
Optimisation :
- Utilisez une table de mémorisation pour stocker les résultats des sous-problèmes qui se chevauchent.
Exemple de procédure pas à pas
Entrée :
mots = ["acca", "bbbb", "caca"], cible = "aba"
Prétraitement :
- comptes[0] = {'a' : 2, 'b' : 0, 'c' : 1}
- comptes[1] = {'a' : 0, 'b' : 3, 'c' : 0}
- comptes[2] = {'a' : 1, 'b' : 0, 'c' : 2}
- comptes[3] = {'a' : 2, 'b' : 0, 'c' : 1}
Calcul DP :
- dp(0, 0) : Combien de façons de former "aba" à partir de la colonne 0.
- Calculer de manière récursive, en combinant l'utilisation de comptes et le saut de colonnes.
Sortie : 6
Complexité temporelle
- Prétraitement : O(n x m), où n est le nombre de mots et m est leur longueur.
- Programmation dynamique : O(l x m), où l est la longueur de la cible.
- Total : O(n x m l x m).
Sortie pour exemple
Ce problème est un excellent exemple de combinaison de prétraitement et de programmation dynamique pour résoudre efficacement un défi combinatoire.
Liens de contact
Si vous avez trouvé cette série utile, pensez à donner une étoile au référentiel sur GitHub ou à partager la publication sur vos réseaux sociaux préférés ?. Votre soutien signifierait beaucoup pour moi !
Si vous souhaitez du contenu plus utile comme celui-ci, n'hésitez pas à me suivre :
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!