Comparație a două linii

Căutați potriviri și substringuri diferite în două rânduri, având în vedere lungimea totală. Rezultatul este un tabel de valori cu numărul de începuturi și terminații ale acelorași fragmente diferite. O ocotă dublă, viteză mare.







Mi-au luat 2 linii pentru a compara și a determina ce fragmente din ele coincid și care diferă. Pentru confort, am adus linii la o lungime. Totuși, dacă se dorește, orice 2 linii pot fi tăiate astfel încât să se compare ca având aceeași lungime. Ei bine, nu s-au găsit decât expresii regulate complicate și nici o căutare de caractere. RegExp nu a putut să adere la livrarea rezultatului în forma corectă (poate că mâinile mele sunt strâmbe), dar nu am vrut să ocol linii lungi. În cele din urmă, am făcut asta, poate că cineva va veni la îndemână.


Funcția obține diferențe Două șir (valoarea șirului1, valoarea șirului 2. Tf = nedefinită, valoarea Delta = 0)

Dacă τφ = Undefined Apoi

// aceasta este prima iterație, inițializată

// rezultatele sunt returnate în tabelul de valori care stabilește fragmentele: # start, no notions, există o diferență (boolean)

тф = tabel nou de valori;

tf. Coloana. Adăugați ("Start");

tf. Coloana. Adăugați ("Sfârșit");

tf. Coloana. Adăugați ("Există o diferență");

Dacă string = string2 Atunci // nu există nicio diferență

strotf = m. Adăugați ();

strotf. Start = 1;

strotf. Sfârșit = lungimea șirului (șir2);

rDlina1 = Lungimea șirului (stro1);

rDlina2 = Lungimea șirului (șir2);

Dacă pLength1 <> rDlina2 Apoi este posibil să se taie sub o singură lungime, este posibil și să se refuze

рМинДлина = Min (рЛлина1, рДлина2);

pMaxXLength = Max (rLength1; rDown2);

Dacă pMinDlina = pDlina1 Atunci str2 = Lew (String2, PMindLean) Sfârșit Dacă;

Dacă pMinDlina = pDlina2 Atunci string1 = Leo (string.pMindLean) Sfârșit Dacă;

Obțineți diferențele celor două șiruri (String1 String2.Tf);

// vom adăuga diferența de lungime, dacă a fost, prin adăugarea "coada" unui șir mai lung

Dacă pMaxXLength <> Atunci

strotf = m. Adăugați ();







strotf. Începutul = рМинДлина + 1;

strotf. Sfârșit = pMaxXLength;

strotf. Există o diferență = Adevăr; // a priori

// se roteste gros (o astfel de masa nu va fi niciodata foarte mare, deci nu puteti excela)

mφ2 = mφ. Copiați coloanele (); STARTER = nedefinit; Star start = 0; sReading = 0;

Pentru fiecare dintre liniile de pe ciclu

Dacă STAR <> strotf. Există o diferență

Dacă STAR <>Nedefinite Apoi / / închideți anterior

strotf2 = mf2. Adăugați ();

strotf2. Start = Start;

strotf2. Sfârșit = devreme;

strotf2. Există o diferență = STAR;

STAR = stârp. Există o diferență;

start = start. Începutul;

vechi = sfârșit. Sfârșitul;

Dacă STAR <>Nedefinite Apoi / / închideți anterior

strotf2 = mf2. Adăugați ();

strotf2. Start = Start;

strotf2. Sfârșit = devreme;

strotf2. Există o diferență = STAR;

// compararea corectă a șirurilor recursive

etstro = stro1; // șir de referință

ostro = string2; // șirul de procesat

pos = Țintă (StrPlinna (obrstro) / 2);

Dacă pos = 0 Atunci Return "" End if; // o situație anormală

kuset1 = Leu (etstro.poz);

cuset2 = mediu (poziția etstrost + 1);

kusobre1 = Leu (poziția obrstrou);

kusobr2 = Mediu (poziție pozitivă + 1);

ism1 = (cuset1 <> kusobr1);

ism2 = (cousset2 <> kusobr2);

// vedeți prima piesă

Dacă nu, atunci

strotf = m. Adăugați ();

strotf. Start =? (RDelta = 0. 1. rDelta);

strotf. Sfârșitul = stresul. Început + СтрДлина (кусобр1) - 1;

strotf. Există o diferență = Lies;

În caz contrar, // această parte este diferită, mergem mai departe, procesându-o ca linie separată

pH = a (rDelta = 0. 1 rDelta);

рКонц = рНачало + СтрДлина (кусобр1) - 1;

Dacă pH-ul este = pQ Apoi apoi // faza finală, 1 simbol diferență

strotf = m. Adăugați ();

strotf. Start = pH;

strotf. Sfârșit = sfârșit;

strotf. Există o diferență = Adevăr;

Obțineți diferențele dintre cele două curse (castravete cușcușul 1).

// a se vedea a doua piesă

rDelta = (poz + 1) + rDelta -? (rDelta = 0. 0. 1);

Dacă nu, atunci

strotf = m. Adăugați ();

strotf. Start = rDelta;

strotf. Sfârșitul = stresul. Începutul + СтрДлина (кусобр2) - 1;

strotf. Există o diferență = Lies;

În caz contrar, // această parte este diferită, mergem mai departe, procesându-o ca linie separată

рКонц = рНачало + СтрДлина (кусобр2) - 1;

Dacă pH-ul este = pQ Apoi apoi // faza finală, 1 simbol diferență

strotf = m. Adăugați ();

strotf. Start = pH;

strotf. Sfârșit = sfârșit;

strotf. Există o diferență = Adevăr;

Obțineți diferențele celor două șiruri (cousset2, castravete2, delta punct de topire);

// nu returnați nimic, rezultatul nu este important







Articole similare

Trimiteți-le prietenilor: