A leghosszabb palindrom részkarakterlánc megkeresése

Az oldal jelenlegi verzióját még nem ellenőrizték tapasztalt közreműködők, és jelentősen eltérhet a 2020. július 16-án felülvizsgált verziótól ; az ellenőrzések 2 szerkesztést igényelnek .

A számítástechnikában a leghosszabb palindrom részkarakterlánc  -probléma egy adott karakterlánc leghosszabb, palindrom részstringjének megtalálása . Például a "banán" leghosszabb palindrom részlánca az "anana". A leghosszabb palindrom részkarakterlánc nem feltétlenül egyedi; például az "abracadabra" karakterláncban nincs három karakternél hosszabb palindrom részkarakterlánc, de vannak olyanok, amelyek pontosan három karakterből állnak, nevezetesen az "aka" és az "ada". Egyes alkalmazások meg akarják találni az összes maximális palindrom részkarakterláncot (nevezetesen az összes olyan részstringet, amely önmagukban palindrom, és nem tölthető ki hosszabb palindrom részkarakterláncokhoz), ahelyett, hogy csak egy részkarakterláncot adna vissza, vagy egy palindrom részkarakterlánc maximális hosszát.

Manacher (1975 ) feltalált egy idő-lineáris algoritmust, amely egy adott karakterlánc elején lévő összes palindromot felsorolja. Azonban, amint azt Apostolico, Breslauer és Galil (1995 ) kimutatta, ugyanaz az algoritmus használható az összes leghosszabb palindrom részstring megtalálására egy adott karakterláncban bárhol, ismét lineáris időben. Ezért megoldást ad arra a problémára, hogy lineáris időben megtaláljuk a maximális palindrom részstringet. Alternatív lineáris időmegoldásokat javasoltak Jeuring (1994 ) és Gusfield (1997 ), akik utótagfák használatán alapuló megoldást írtak le . A probléma megoldására hatékony párhuzamos algoritmusok is ismertek. [egy]

A leghosszabb palindrom részsorozat megtalálásának problémáját nem szabad összetéveszteni a leghosszabb palindrom részsorozat megtalálásának problémájával .

Menedzser algoritmusa

Egy karakterlánc leghosszabb palindromának lineáris időben történő megtalálásához az algoritmus a palindromok és szubpalindromok következő tulajdonságait használhatja:

  1. A palindrom bal oldala a jobb oldalának tükörképe.
  2. (1. eset) Egy harmadik palindrom, amelynek középpontja az első palindrom jobb oldalán van, pontosan akkora hosszú lesz, mint a második palindromé, amelynek középpontja a bal oldalra tükröződik, ha a második palindrom az elsőn belül helyezkedik el, és távolodik a határtól legalább egy karakterre.
  3. (2. eset) Ha a második palindromnak közös határa van az első palindrommal, vagy túlnyúlik azon, akkor a harmadik palindrom hossza garantáltan nem lesz kisebb, mint a középpontja és az első palindrom jobb határa közötti távolság. Ez a hosszúság a második palindrom középpontja és az első palindrom bal szélső karaktere közötti távolság.
  4. A harmadik palindrom hosszának meghatározásához a 2. esetben össze kell hasonlítani az első palindrom jobb szélső karakterét követő karaktereket a harmadik palindrom középpontjának tükörképével mindaddig, amíg vagy a karakterlánc ki nem merül, vagy a karakterek találhatók.
  5. (3. eset) Sem az első, sem a második palindrom nem ad információt egy negyedik palindrom hosszának meghatározásához, amelynek középpontja az első palindrom határán kívül van.
  6. Ezért a karakterláncban lévő részkarakterláncok palindrom hosszának balról jobbra történő meghatározásához kívánatos egy referencia palindrom (amely az első palindromként működik), amelynek karakterei a karakterlánc jobb szélső pozícióját foglalják el (és így a harmadik palindrom a 2. esetben és a negyedik palindrom a 3. esetben helyettesítheti az első palindromot, és az új referencia palindrommá válik).
  7. A karakterlánc egyes karaktereinél a palindrom hossz meghatározásához szükséges idő becslésével kapcsolatban: az 1. esetben nem történik karakter-összehasonlítás, a 2. és 3. esetben csak a referencia palindrom jobb szélső karakterén túl eső karakterláncok a jelöltek. összehasonlítás (és ezért a 3. eset mindig a referencia palindrom változásához vezet, amikor a 2. eset csak akkor változtatja meg a referencia palindromot, ha kiderül, hogy a harmadik palindrom hossza valójában nagyobb, mint az ígért minimális hossz).
  8. A páros fokú palindromok középpontja a palindrom két középső szimbóluma között helyezkedik el.

Megvalósítás

Legyen:

Eredmény: A leghosszabb palindrom vagy a karakterlánc első karaktere

#include <karakterlánc> #include <vektor> névtér használata std ; string longestPalindrom ( const string & s ){ vektor < char > s2 ( s . méret ( ) * 2 + 1 , '#' ); //egy pszeudokarakterlánc létrehozása '#' korláttal a következőhöz: ( int i = 0 ; i != s . size (); ++ i ){ s2 [ i * 2 + 1 ] = s [ i ]; } intp [ s2 . _ méret ()]; int r , c , index , i_mir ; int maxLen = 1 ; i_mir = index = r = c = 0 ; for ( int i = 1 ; i != s2 . méret () - 1 ; ++ i ){ i_mir = 2 * c - i ; //Ha az előző eredmény sugarába esünk, //akkor a p [ i ] = r > i tükrözési eredményből kivehető az aktuális sugár kezdőértéke ? min ( p [ i_mir ], r - i ) : 0 ; míg ( i > p [ i ] && ( i + p [ i ] + 1 ) < s2 . méret ( ) && s2 [ i - p [ i ] - 1 ] == s2 [ i + p [ i ] + 1 ] ) ++ p [ i ]; if ( p [ i ] + i > r ){ c = i ; r = i + p [ i ]; } if ( maxLen < p [ i ]){ maxLen = p [ i ]; index = i ; } } //A talált pozíciókat leképezi az eredeti string return s . substr (( index - maxLen ) / 2 , maxLen ); }

Jegyzetek

  1. Crochemore és Rytter (1991 ), Apostolico, Breslauer és Galil (1995 ).

Irodalom

Linkek

Ez a cikk a PEGWikin található leghosszabb palindrom részstring szövegét tartalmazza a Creative Commons Attribution ( CC-BY-3.0 ) licenc alatt.