Se la sovrapposizione è consentita, può essere eseguita in tempo lineare (nella dimensione della stringa di input).
Alcune definizioni
Definiamo il concetto di palindromo massimo :
Un palindromo massimo di raggio k di una stringa S è una sottostringa S 'tale che
- partendo dal centro, S 'legge gli stessi k caratteri in entrambe le direzioni
- ma non per k + 1 caratteri
- k> 1 (quindi un singolo personaggio non è un palindromo)
per esempio, se S = banana
, allora S' = anana
è un palindromo massimo di raggio 2.
Un palindromo massimo è un palindromo massimo di raggio k per alcuni k.
Per esempio, se S = banana
, "ana"
, "anana"
, sono tutti i palindromi massime.
Usando palindromi massimi
Ora, se potessimo individuare tutti i palindromi massimi di una stringa , sarebbe semplice verificare se l'intera stringa è una concatenazione di palindromi.
Prendi S = abbaccazayaz
. I suoi massimi palindromi sono:
- abba, centrato tra la posizione 2 e 3, raggio = 2
- acca, centrato tra le posizioni 5 e 6, raggio = 2
- zayaz, centrato in posizione 10, raggio = 2
così "abba" si estende su [1..4], "acca" si estende su [4..7], "zayaz" si estende su [8..12]. Poiché la concatenazione di questi tre palindromi (la sovrapposizione è consentita?) Si estende su tutta la stringa, ne consegue che "abbaccazayaz" è concatenazione dei palindromi.
Calcolo dei palindromi massimi in tempo lineare
Ora, si scopre che possiamo localizzare tutti i massimi palindromi di una stringa S in tempo lineare !*
L'idea è di utilizzare un albero di suffisso per S dotato di query antenate comuni più basse a tempo costante .
Quindi possiamo verificare se una stringa S di lunghezza m è una concatenazione di palindromi nel tempo O (n).
*
Gusfield, Dan (1997), "9.2 Trovare tutti i palindromi massimi nel tempo lineare", algoritmi su archi, alberi e sequenze