La nautezza bruta è O (m * n * k). Ecco alcune idee per l'ottimizzazione.
Ricerca singolo
Invece di fare una ricerca di orizzontali e poi un altro per mercati verticali, fare entrambe le cose contemporaneamente. Ogni volta che trovi una ricorrenza della prima lettera dell'ago, cerca una corrispondenza orizzontale e verticale che inizi a quella lettera. Ciò non migliorerà la complessità, ma in molti casi questo potrebbe dimezzare il tempo dal momento che vedrai solo le partenze sbagliate una volta.
rare lettere
Invece di cercare per la prima lettera dell'ago, cercare la lettera più raro che si verifica nel ago. Questo escluderà molte delle possibili partite. Per determinare quali lettere sono più rare scansionare l'intera scheda o utilizzare il campionamento casuale.
String efficiente Ricerca
Usa una migliore string searching algorithm come Knuth–Morris–Pratt. Cerca ogni riga e ogni colonna individualmente usando l'algoritmo. La mia scommessa è che questo è ciò che gli intervistatori cercano, dal momento che riduce la complessità a O (m * n).
Exploit righe brevi
ho notato che non tutte le righe hanno la stessa lunghezza. Quando cerchi le corrispondenze verticali, puoi interrompere la ricerca su quella riga non appena l'ago esce dal sacco, poiché anche gli aghi più avanti lungo la fila usciranno dal sacco e quindi non possono essere abbinati.
Cosa c'è di sbagliato nella ricerca della formica da sinistra a destra dall'alto verso il basso separatamente? –
Mi è stato detto da due intervistatori consecutivi che esiste un approccio migliore. Non sono sicuro, "migliore" in che senso intendevano. – hytriutucx
@ javacoder990: non hai chiesto agli intervistatori cosa volevano dire? –