data una stringa (assumere solo caratteri inglesi) S
di lunghezza n
, possiamo contare il numero di sottostringhe palindromiche con il seguente algoritmo:conteggio sottostringhe palindromi a O (n)
for i = 0 to |S| do
p1 = number of palindromes centered in i (odd length)
p2 = number of palindromes centered in i and i+1 (even length)
add p1 + p2 to total number of palindromic substrings of S
Il codice sopra è O(n^2)
però.
Sono interessato a un algoritmo che risolve questo problema in O(n)
. So per certo che esiste come ho sentito dire da più persone, e il problema esiste in un sito locale di giudici online con un limite superiore di 1 000 000
su n
, tuttavia non ho mai visto l'algoritmo e non posso sembra di essere in grado di venire con esso.
Aggiornamento:
L'idea generale che ho è quello di calcolare len[i] = length of the longest palindrome centered at the character 2i + 1
e un allineamento simile per palindromi anche di lunghezza. Con una buona contabilità, dovrebbe essere possibile calcolare questo in O(1)
per ogni personaggio, che ci permetterà di contare un sacco di palindromi tutti in una volta. Sono bloccato su come calcolare esattamente questo comunque.
Accetterò una soluzione che utilizza O(n)
e forse anche la memoria aggiuntiva O(n log n)
. Penso che sia impossibile senza di esso.
Tutte le buone idee o referenze sono apprezzate.
Cosa ti fa pensare che la soluzione sia O (n) ora? Inoltre, è piuttosto strano avere un algoritmo di tempo O (n) che richiede spazio O (n log n). –
@Strilanc - Penso che sia O (n) perché è la complessità menzionata da alcune persone e l'unica cosa che può essere eseguita in 0,1 secondi su un milione di caratteri. – IVlad
Correlati: [Scrivi una funzione che restituisca il palindromo più lungo in una determinata stringa] (http://stackoverflow.com/q/1115001/54262) –