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