Un'opzione sarebbe quella di memorizzare tutte le parole inglesi valide in un trie. Una volta che hai fatto questo, potresti iniziare a camminare il trie dalla radice verso il basso, seguendo le lettere nella stringa. Ogni volta che si trova un nodo che è contrassegnato come una parola, avete due opzioni:
- rompere l'ingresso a questo punto, o
- Continua l'estensione della parola.
È possibile affermare di aver trovato una corrispondenza una volta interrotto l'input in un insieme di parole che sono tutte legali e che non sono rimasti caratteri rimanenti. Dato che ad ogni lettera hai un'opzione forzata (o stai costruendo una parola che non è valida e dovrebbe fermarsi -oppure puoi continuare ad estendere la parola) o due opzioni (divisa o continua), potresti implementare questa funzione utilizzando la ricorsione esaustivo:
PartitionWords(lettersLeft, wordSoFar, wordBreaks, trieNode):
// If you walked off the trie, this path fails.
if trieNode is null, return.
// If this trie node is a word, consider what happens if you split
// the word here.
if trieNode.isWord:
// If there is no input left, you're done and have a partition.
if lettersLeft is empty, output wordBreaks + wordSoFar and return
// Otherwise, try splitting here.
PartitinWords(lettersLeft, "", wordBreaks + wordSoFar, trie root)
// Otherwise, consume the next letter and continue:
PartitionWords(lettersLeft.substring(1), wordSoFar + lettersLeft[0],
wordBreaks, trieNode.child[lettersLeft[0])
Nel caso peggiore patologicamente questo elenco di tutte le partizioni della stringa, che può t esponenzialmente lungo. Tuttavia, ciò si verifica solo se è possibile suddividere la stringa in un numero enorme di modi in cui tutti iniziano con parole inglesi valide ed è improbabile che si verifichino nella pratica. Se la stringa ha molte partizioni, potremmo passare molto tempo a trovarle, però. Ad esempio, considera la stringa "dotheredo". Possiamo dividere questo molti modi:
do the redo
do the red o
doth ere do
dot here do
dot he red o
dot he redo
Per evitare questo, si potrebbe desiderare di istituire un limite del numero di risposte si segnala, forse due o tre.
Poiché interrompiamo la ricorsione quando usciamo dal trie, se mai proviamo uno split che non lascia il resto della stringa valido, lo rileveremo abbastanza rapidamente.
Spero che questo aiuti!
So che questo è un vecchio post ma ho avuto una domanda dopo aver letto il tuo bel post sul blog. L'O (2^n) mi lascia ancora perplesso sulla soluzione generale, anche se intuitivamente potrebbe avere senso. Ho provato a utilizzare un conbinatorics per risolverlo e risolvere la ricorrenza (T (n) = n * T (n-1) + O (k)) ma posso ottenere un limite che riguarda il prodotto di n! con la funzione Gamma. Hai provato a risolvere anche la ricorrenza per ottenere l'O (2^n)? – ak3nat0n
Questo aiuto? https://en.wikipedia.org/wiki/Composition_%28combinatorics%29 –