7
votes

Fendre la chaîne en mots

Je recherche l'algorithme le plus efficace pour former toutes les combinaisons possibles des mots d'une chaîne. Par exemple: xxx

(tous les mots doivent provenir d'un dictionnaire).

Je peux penser à une approche de force brute. (Trouvez toutes les substrings et matchs possibles) mais quelles seraient de meilleurs moyens?


1 commentaires

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.


4 Réponses :


0
votes

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    
}


0 commentaires

6
votes

Utilisez un Arbre préfixe pour votre liste de mots connus. Probablement libs comme myspell le faire déjà. Essayez d'utiliser un prêt-fait.

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»).

efficacement, vous maintenez une file d'attente de paires (start_position, courant_position) 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 et est déjà connu jusqu'à actuel_position 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) .


1 commentaires

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].



1
votes

Voir cette question qui a encore de meilleures réponses. C'est un problème de programmation dynamique standard:

Comment diviser une chaîne en mots. Ex: "stringintowords" -> "String en mots"?


0 commentaires

0
votes

chaîne d'entrée: forevercarrot

sortie:

Forever Carotte pour toujours la pourriture de voiture Pour toujours carotte Pour toute la pourriture de voiture

Programme: xxx


0 commentaires