Ci sono alcune buone risposte già qui, e penso che un trie è probabilmente il modo giusto per andare, ma questo è un problema interessante quindi mi lancio in pena i miei due centesimi ...
Il l'approccio ingenuo sarebbe quello di generare tutte le permutazioni delle lettere disponibili e di tutti i sottoinsiemi distinti, quindi cercare ogni parola potenziale nel dizionario. Il problema è che, anche se non è difficile farlo, c'è un numero sorprendentemente alto di parole potenziali e la maggior parte di esse non è valida.
Sul lato positivo, la verifica del dizionario può essere velocizzata con una ricerca binaria o qualcosa di simile. Sul lato negativo, lo faresti così tante volte che il programma si fermerebbe per lunghe liste di lettere.
Abbiamo sicuramente bisogno di pre-elaborazione il dizionario per renderlo più utile, e cosa abbiamo veramente bisogno è di avere un modo per escludere rapidamente la maggior parte dei potenziali partner, anche se il metodo ha occasionali falsi positivi.
Un modo per farlo sarebbe quello di rappresentare quali lettere utilizza una parola in una mappa bit. In altre parole, precalcolo di un numero a 32 bit per ogni parola nel dizionario, in cui ogni bit viene impostato se la parola corrispondente dell'alfabeto viene utilizzata nella parola almeno una volta. Questo ti permetterebbe di trovare tutte le potenziali parole facendo una scansione lineare del dizionario e mantenendo solo quelle che usano solo le lettere che hai a disposizione. Sospetto che, con un po 'di intelligenza e indicizzazione, tu possa fare meglio di lineare.
Tra i candidati, alcuni richiedono più istanze di una lettera di quelle disponibili, quindi saranno falsi positivi. Ciò significa che devi eseguire un controllo finale su tutti i candidati che hai generato per eliminare i quasi-hit. Ci sono molti modi per farlo, ma uno dei più semplici è quello di passare attraverso la tua lista di lettere e sostituire la prima occorrenza di quella lettera nella parola potenziale con un trattino.Quando hai finito, se la parola potenziale ha qualcosa a parte i trattini, è un fallimento. Una soluzione più elegante, sebbene non necessariamente più veloce, sarebbe quella di generare una serie di frequenze di lettere e confrontarle.
Ancora una volta, penso che i tentativi siano probabilmente la strada da percorrere, ma spero che queste idee ti siano utili.
modificare
Permettetemi di buttare fuori un esempio di come si potrebbe fare meglio di una ricerca lineare completo sulla ricerca iniziale: usa la radice. Mantieni un semplice indice che ti consente di cercare la prima parola che inizia con una determinata lettera. Quindi, quando fai la ricerca, salta su tutte le parole che iniziano con una lettera che non hai. Questa non è una gigantesca accelerazione, ma è un miglioramento.
Quindi la domanda non è realmente "come iterare in modo efficiente su un vettore", ma piuttosto "come scoprire in modo efficiente se una parola nella raccolta può essere assemblata da un insieme di lettere"? – jalf
Nella descrizione del problema non sembra che si tenga conto che le parole possono essere formate in base al tabellone e alla mano del giocatore. – jemfinch
Oh. Non stavo prendendo in considerazione questo. Grande, ma più complessità aggiunta a un problema complesso già (per il mio livello di conoscenza) –