Trovare tutti i modi possibili per inserire un motivo in una stringa

8

Ho pensato a questo problema per un po ', e posso trovare solo una soluzione ricorsiva, ma sento che esiste un modo di programmazione dinamico per farlo, ma non riesco a capirlo. È un problema famoso che non conosco?

Q: dati una stringa e un pattern, restituisci il numero di modi univoci di corrispondenza delle lettere del pattern (in ordine) con la stringa.

Chiarimento: Per trovare una corrispondenza, si prende il primo carattere del pattern, si trova il primo carattere corrispondente nella stringa, quindi si prende il secondo carattere del pattern e si combina con il primo carattere corrispondente della stringa che è DOPO il carattere precedentemente abbinato.

Esempio 1 (4 partite):

Stringa: DABBCDDE

Pattern: ABD

Possibili modi (i caratteri in grassetto sono dove il modello è abbinato alla stringa):

  • D AB BC D DE
  • D A B B C D DE
  • D AB BCD D E
  • D A B B CD D E

Esempio 2 (0 corrispondenze):

Stringa: ABC

Pattern: BCA

(Corrispondi a B, C e sei alla fine della stringa, NON puoi tornare indietro e trovare corrispondenze con i personaggi precedenti)

Con l'approccio ricorsivo, ho un metodo che tiene traccia di quale indice sono sulla stringa ( sIndex ) e del pattern ( pIndex ) . Se stringa [sIndex] corrisponde al modello [pIndex], chiamiamo di nuovo il metodo e aumentiamo sIndex e pIndex. Altrimenti, basta aumentare sIndex e riprovare a trovare una corrispondenza. Il metodo restituisce il numero totale perché il valore restituito delle chiamate ricorsive viene sommato. (Le corrispondenze aggiungono 1, nessuna corrispondenza aggiunge 0)

Casi di base:

  • Se pIndex è maggiore della lunghezza del pattern, restituisci 0.

  • Se sIndex è più grande della lunghezza della stringa, restituisci 1 (abbiamo trovato una corrispondenza!)

Quali altre soluzioni ci sono?

    
posta Daniel Olsson 09.03.2016 - 16:06
fonte

1 risposta

1

Penso che non sia necessario utilizzare la programmazione dinamica per risolvere questo problema. Penso che questa sia la soluzione:

  1. Innanzitutto, crea l'elenco degli elenchi per mantenere le occorrenze dei caratteri nel modello nel testo specificato.

  2. Sarà così

Il seguente diagramma:

   A    B    D 
             0 
   1 -> 2 -> 5
        3    6 
  1. Ciò implica (supponendo 0-indexing) A si verifica in 0th position, B si verifica in 2,3 posizioni, D si verifica in 0,5,6 posizioni.

  2. Per ciascuna delle coppie colonne consecutive (qui A, B e B, D) usano i puntatori per mappare i valori corrispondenti in una colonna ai successivi valori maggiori nella colonna successiva. Qui 1 (in col1) ha un puntatore a 2 (in col2) e 2 (in col2) ha un puntatore a 5 (in col3) poiché 0 è minore di 2. 3 (in col2) ha un puntatore a 5 (in col3 ) (Non ho potuto disegnare qui).

  3. Per ogni valore nella prima colonna, trova il numero di possibili modi usando i puntatori. Qui 1 - > 2 e 2 - > 5 e quindi il numero di modi possibili è 2 * 2 modi (cioè, 1- > 2- > 5, 1- > 2- > 6, 1- > 3- > 5, 1- > 3- > 6). Devi solo moltiplicare il numero di elementi rimanenti nella colonna per ogni valore di A.

  4. Qui è presente solo 1 valore per Column1 (cioè, A). Se ci sono più colonne, calcoliamo il valore per ogni valore di A usando i puntatori e sommiamo tutti loro per ottenere il numero di modi.

  5. Penso che la complessità sia O (n) come costruire la lista è O (n), lo spazio dei puntatori e il tempo di costruzione è O (n).

risposta data 11.03.2016 - 14:44
fonte

Leggi altre domande sui tag