Une option serait de stocker tous les mots anglais valides dans un trie. Une fois que vous avez fait cela, vous pouvez commencer à parcourir le trie à partir de la racine vers le bas, en suivant les lettres dans la chaîne. Chaque fois que vous trouvez un nœud marqué comme un mot, vous avez deux options:
- Couper l'entrée à ce point, ou
- Continuer à étendre le mot.
Vous pouvez prétendre avoir trouvé une correspondance une fois que vous avez découpé l'entrée en un ensemble de mots qui sont tous légaux et n'ont plus de caractères restants. Comme à chaque lettre vous avez soit une option forcée (soit vous construisez un mot qui n'est pas valide et vous devez arrêter - soit vous pouvez continuer à étendre le mot) soit deux options (diviser ou continuer), vous pourriez implémenter cette fonction en utilisant une récursivité exhaustive:
PartitionWords(lettersLeft, wordSoFar, wordBreaks, trieNode):
// Si vous avez parcouru le trie, ce chemin échoue.
si le trieNode est nul, retourne.
// Si ce nœud trie est un mot, envisagez ce qui se passe si vous divisez
// le mot ici.
si trieNode.isWord:
// S'il ne reste plus d'entrée, vous avez terminé et avez une partition.
si lettersLeft est vide, affichez wordBreaks + wordSoFar et retourne
// Sinon, essayez de diviser ici.
PartitinWords(lettersLeft, "", wordBreaks + wordSoFar, trie root)
// Sinon, consommez la lettre suivante et continuez:
PartitionWords(lettersLeft.substring(1), wordSoFar + lettersLeft[0],
wordBreaks, trieNode.child[lettersLeft[0])
Dans le pire des cas pathologiques, cela listera toutes les partitions de la chaîne, ce qui peut être exponentiellement long. Cependant, cela se produit uniquement si vous pouvez partitionner la chaîne de nombreuses façons commençant toutes par des mots anglais valides, et cela est peu probable en pratique. Si la chaîne a de nombreuses partitions, nous pourrions passer beaucoup de temps à les trouver, cependant. Par exemple, considérez la chaîne "dotheredo." Nous pouvons la diviser de nombreuses façons:
do the redo
do the red o
doth ere do
dot here do
dot he red o
dot he redo
Pour éviter cela, vous voudrez peut-être instituer une limite du nombre de réponses que vous signalez, peut-être deux ou trois.
Comme nous interrompons la récursivité lorsque nous parcourons le trie, si nous essayons une division qui ne laisse pas le reste de la chaîne valide, nous le détecterons assez rapidement.
J'espère que cela vous aidera!