Un'implementazione di psuedocode, sfruttando il fatto che ogni parte della stringa deve essere una parola, non possiamo saltare nulla. Lavoriamo in avanti dall'inizio della stringa fino a quando il primo bit è una parola, e quindi generiamo tutte le possibili combinazioni del resto della stringa. Una volta che lo abbiamo fatto, continuiamo ad andare avanti finché non troviamo altre possibilità per la prima parola, e così via.
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
}
lo spauracchio in questo codice è che si finirà per ripetere i calcoli - nel tuo esempio, si finirà per dover calcolare allPossibleWords("carrot")
due volte - una volta nel ["forever", allPossibleWords["carrot"]]
e una volta in ["for", "ever", allPossibleWords["carrot"]]
. Quindi ricordare questo è qualcosa da considerare.
fonte
2011-01-21 03:51:44
Il tuo approccio a forza bruta è corretto. Immagina che ti sia stato dato lo stesso problema tranne che per la richiesta di parole in una lingua straniera. – Apalala