Domanda

Voglio trovare la più lunga sequenza possibile di parole che corrispondono le seguenti regole:

  • Ogni parola può essere usata al massimo una volta
  • Tutte le parole sono le stringhe
  • due stringhe sa e sb possono essere concatenate se gli ultimi due caratteri del sa partite i primi due caratteri della sb.

Nel caso di concatenazione, viene eseguita sovrapponendo tali caratteri. Ad esempio:

  • sa = "torino"
  • sb = "Novara"
  • sa concat sb = "torinovara"

Ad esempio, ho il seguente file di input, "input.txt":

Novara

Torino

Vercelli

Ravenna

Napoli

liverno

Messania

Novi Ligure

Roma

E, l'output del file di cui sopra secondo le regole di cui sopra dovrebbe essere:

Torino

Novara

Ravenna

Napoli

Livorno

Novi Ligure

in quanto il più lungo possibile è la concatenazione:

torinovaravennapolivornovilligure

Qualcuno può darmi una mano con questo? Quale sarebbe la migliore struttura dei dati per questo?

È stato utile?

Soluzione

Questo può essere presentato come un problema grafo orientato - i nodi sono parole, e sono collegati da un bordo se si sovrappongono (e la più piccola sovrapposizione viene scelto per ottenere la lunghezza più lunga), e poi trovare il più alto peso non percorso -intersecting.

(Beh, in realtà, si vuole ampliare il grafico un po 'per gestire iniziando e terminando una parola. Attiguo ad un "a partire nodo" con con un bordo ad ogni parola di lunghezza peso parola / 2. Tra le parole, -overlap + lunghezza di inizio + lunghezza finitura / 2, e tra una parola e un "nodo finale" "lunghezza di parola / 2". Potrebbe essere più facile da raddoppiarlo.)

https://cstheory.stackexchange.com/questions/3684 / max-non sovrapposte-path-in-weighted-graph

Altri suggerimenti

Vorrei iniziare davvero semplice. Fare 2 vettori di stringhe, un ordinato normalmente, uno ordinato secondo le ultime 2 lettere. Creare un indice (vettore di int) per il secondo vettore che indica la sua posizione nel primo.

Per trovare la più lunga .. prima rimuovere gli orfani. parole che non corrispondono alle due estremità a qualsiasi cosa. Poi si vuole costruire un vicino di casa che unisce albero, è qui che si determina che le parole possono eventualmente raggiungere l'altro. Se si dispone di 2 o più alberi si dovrebbe provare il più grande albero di prima.

Ora con un albero il vostro compito è di trovare le estremità che sono rare, e li legano ad altri fini, e ripetere. Questo dovrebbe farti una soluzione abbastanza piacevole, se usa tutte le parole tuo oro, saltare gli altri alberi. Se così non fosse allora la vostra in tutta una serie di algoritmi per rendere questo efficiente.

Alcuni elementi da prendere in considerazione: Se si dispone di 3+ ??estremità unici si sono garantiti a cadere 1+ parole. Questo può essere usato per potare i vostri tentativi verso il basso, mentre la caccia per una risposta. ricalcolare le estremità unici spesso. numeri dispari di un dato fine assicurano che uno deve essere eliminato (si ottiene 2 omaggi alle estremità). parole segregano quella partita possono auto, si può sempre gettare scorso, e letame la matematica altrimenti. Si può essere in grado di creare piccoli anelli di auto di corrispondenza, è possibile trattare questi come le parole di sé corrispondenti, fino a quando non li orfano quando li si crea. Questo può rendere la prestazione fantastica, ma non ci sono garanzie su una soluzione perfetta.

Lo spazio di ricerca è ordine (N!) Un elenco di milioni di elementi può essere difficile da dimostrare una risposta esatta. Naturalmente potrei essere vista qualcosa.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top