eseguendo una ricerca completa di permutazione e sostituendola su una stringa

2

Sto scrivendo un'app che fa qualcosa di simile a un generatore di placca di numeri personalizzati (licenza) dove se chiedo il piatto "robin" suggerirà di provare:

  • r0bin
  • rob1n
  • r0b1n

Esistono degli algoritmi pubblicati che possono farlo? Deve essere in grado di gestire la sostituzione di singole lettere con multipli, ad es. m con rn e vise-versa e non cadere se sostituisce un i con un l poi viene a controllare la l e la sostituisce a un i.

L'elenco di ciò che viene scambiato con quello che sarà l'input dell'utente, ma non mi aspetto una lista enorme, forse al massimo 10 paia.

Lo implementerò in Ruby o Python ma dovrei essere in grado di convertire il codice da qualsiasi altra lingua.

    
posta Digininja 21.11.2012 - 23:41
fonte

2 risposte

1

Per prima cosa, ottieni un elenco di sostituzioni che avrebbe apportato:

  • I - > 1
  • A - > 4
  • m - > rn
  • ecc ...

Avrai un insieme limitato di questi cambiamenti.

Per quel set, genera il set di combinazioni . Se hai 10 cambiamenti, ci sono probabilmente 1024 cambiamenti totali. Questa lista è tutte le modifiche da 0 a 1023. Prendi la rappresentazione bit di ciascuno di questi valori. Il cambio 953 (1110111001) avrebbe applicato la prima, la seconda, la terza, la quinta, la sesta, la settima e la decima.

Questo potrebbe essere ridotto solo avendo delle modifiche che contengono una lettera candidata (non avrebbe senso cercare di applicare la modifica "m" - > "rn" quando non c'è una "m" in " robin').

    
risposta data 21.11.2012 - 23:55
fonte
0

In base alla mia comprensione delle tue esigenze, non sono a conoscenza di un algoritmo pubblicato appositamente per il tuo caso, ma puoi crearne uno usando la seguente discussione.

Userò un esempio strano, ma vedrai perché presto. Supponiamo che tu abbia una stringa come

AB1C4D6

Supponi che:

Il carattere nella posizione 3 può avere valori (1,2,3), ovvero 3 valori distinti.

Il carattere nella posizione 5 può avere valori (4,5), cioè 2 valori distinti.

Il carattere in posizione 7 può avere valori (6,7), cioè 2 valori distinti.

Di seguito sono riportati i possibili esiti dell'esecuzione di varie operazioni sostitutive sulla stringa originale.

Il numero totale di stringhe che possiamo ottenere è 3x2x2 = 12 (inclusa la stringa iniziale).

Questo processo è simile alla generazione di prodotti cartesiani di 3 set (come SELECT * FROM T1, T2, T3).

Dato una lunghezza di stringa di N lettere, se ogni lettera ha al massimo r_i possibili caratteri di sostituzione, allora avremmo un totale di (r_0 * r_1 * r_2 * ... * r_N) parole dove r_i = 1 se non ci sono rimpiazzi per la lettera.

Il motivo per cui ho scelto questo specifico esempio è che esiste una descrizione su come generare il prodotto cartisiano in qui che utilizza valori simili, quindi sarebbe facile da seguire (anche se non è né in Ruby né in Python).

Il concetto sarà lo stesso se si esegue il mapping di 1 carattere di input a più di 1 carattere purché si effettui un singolo passaggio alla stringa e si usi la funzione appropriata per eseguire la sostituzione.

    
risposta data 22.11.2012 - 04:42
fonte

Leggi altre domande sui tag