Je recherche l'algorithme le plus efficace pour former toutes les combinaisons possibles des mots d'une chaîne. Par exemple: (tous les mots doivent provenir d'un dictionnaire). P> Je peux penser à une approche de force brute. (Trouvez toutes les substrings et matchs possibles) mais quelles seraient de meilleurs moyens? P> p>
4 Réponses :
Une implémentation pseudocode, exploitant le fait que chaque partie de la chaîne doit être un mot, nous ne pouvons rien ignorer. Nous travaillons en avant à partir du début de la chaîne jusqu'à ce que le premier bit soit un mot, puis générer toutes les combinaisons possibles du reste de la chaîne. Une fois que nous avons fait cela, nous continuons à aller jusqu'au bout d'autres possibilités pour le premier mot, etc.
allPossibleWords(string s, int startPosition) { list ret for i in startPosition..s'length if isWord(s[startPosition, i]) ret += s[startPostion, i] * allPossibleWords(s, i) return ret }
Utilisez un Arbre préfixe pour votre liste de mots connus. Probablement libs comme Une fois que vous avez trouvé une correspondance (par exemple, une «voiture»), divisez votre calcul: une branche commence à rechercher un nouveau mot («pourri»), une autre continue à explorer des variantes de début de début («carotte»). p>
efficacement, vous maintenez une file d'attente de paires myspell code> le faire déjà. Essayez d'utiliser un prêt-fait. P>
(start_position, courant_position) code> de compensations dans votre chaîne chaque fois que vous divisez le calcul. Plusieurs threads peuvent apparaître de cette file d'attente en parallèle et essayer de continuer un mot qui commence à partir de
start_position code> et est déjà connu jusqu'à
actuel_position code> de la paire, mais ne s'arrête pas là. Lorsqu'un mot est trouvé, il est rapporté et une autre paire est apparue de la file d'attente. Quand c'est impossible, aucun résultat n'est généré. Lorsqu'une scission survient, une nouvelle paire est ajoutée à la fin de la file d'attente. Initialement, la file d'attente contient un
(0,0) code>. P>
En plus, assurez-vous de ne pas répéter le calcul des divisions de 'carotte' deux fois - une fois pour "pour toujours" et une fois pour "pour toujours". Cache Touches partielles: définie (divisions possibles) pour chacun [i..n].
Voir cette question qui a encore de meilleures réponses. C'est un problème de programmation dynamique standard: P>
Comment diviser une chaîne en mots. Ex: "stringintowords" -> "String en mots"? P>
chaîne d'entrée: forevercarrot
sortie: p>
Forever Carotte pour toujours la pourriture de voiture Pour toujours carotte Pour toute la pourriture de voiture p>
Programme: p>
Votre approche de force brute a raison. Imaginez que vous avez reçu le même problème, à l'exception de la demande de mots dans une langue étrangère.