ПредишенСледващото

Търсене и съвпадение различен подниз на два реда, подадени до общата дължина. Резултати - таблични стойности №№ началото и края на еднакви и различни фрагменти. Дихотомна байпас, висока скорост.

Отне ми 2 линии за сравнение и определи кои части от тях са едни и същи, и които са различни. За удобство е довело до дължина низ. Въпреки това е възможно нарязан надолу, така че да се сравняват двете със същата дължина, ако е необходимо, всякакви два реда. Е, нищо, но трудни регулярни изрази така символ-мъдър изброяване не е намерен. RegExp pripahali не успя да издаде резултати в правото ми (може би си ръка крива) и един знак образуват да заобиколят дългите линии не искат да. В резултат на това аз направих това, може би това е полезно.


функция PoluchitRazlichiyaDvuhStrok (баджове stro1 означава stro2. Tf = Неопределен означава rDelta = 0)

Ако TF = Неопределен Тогава

// това е първата итерация, инициализира

// резултати в таблицата за възстановяване стойност определяне фрагменти: № nachsim, № Kons, EstRaznitsa (булеви)

TF = нов TablitsaZnacheny;

TF. Колона. Добави ( "Старт");

TF. Колона. Добави ( "The End");

TF. Колона. Добави ( "EstRaznitsa");

Ако stro1 = stro2 Тогава // никаква разлика

strotf = TF. Добави ();

strotf. Започнете = 1;

strotf. Край = StrDlina (stro2);

rDlina1 = StrDlina (stro1);

rDlina2 = StrDlina (stro2);

Ако rDlina1 <> Тогава rDlina2 // могат да се режат на същата дължина, както и да се откаже

rMinDlina = Min (rDlina1 rDlina2.);

rMaksDlina = Max (rDlina1 rDlina2.);

Ако rMinDlina = rDlina1 Тогава stro2 = Лъв (stro2 rMinDlina.) ENDIF;

Ако rMinDlina = rDlina2 Тогава stro1 = Лъв (stro1 rMinDlina.) ENDIF;

PoluchitRazlichiyaDvuhStrok (stro1 stro2 TF ..);

// doobrabotaem разлика дължини, ако беше от написването на "опашка" от по-дългия низ

Ако rMaksDlina <> 0 След

strotf = TF. Добави ();

strotf. Като се започне rMinDlina = + 1;

strotf. Край = rMaksDlina;

strotf. EstRaznitsa = True; // априори

// това ще обърнем груб (тази маса никога няма да бъде много голяма, така че не може да се отличи)

TF2 = TF. SkopirovatKolonki (); starER = Неопределен; starNachalo = 0; starKonets = 0;

За всеки цикъл strotf От TF

Ако starER <> strotf. Тогава EstRaznitsa

Ако starER <>Тогава // неопределен приключи предишната

strotf2 = TF2. Добави ();

strotf2. Започнете = starNachalo;

strotf2. Край = starKonets;

strotf2. EstRaznitsa = starER;

starER = strotf. EstRaznitsa;

starNachalo = strotf. Започнете;

starKonets = strotf. Край;

Ако starER <>Тогава // неопределен приключи предишната

strotf2 = TF2. Добави ();

strotf2. Започнете = starNachalo;

strotf2. Край = starKonets;

strotf2. EstRaznitsa = starER;

// рекурсивен подходящо сравнение низ

etstro = stro1; // линия стандарт

obrstro = stro2; // Обработете низ

Китка = Int (StrDlina (obrstro) / 2);

Ако Поузи = 0 След това се върнете "" ENDIF; // ненормално положение

kuset1 = Leo (etstro Китка.);

kuset2 = Ср (etstro Китка + 1);

kusobr1 = Leo (obrstro Китка.);

kusobr2 = Ср (obrstro Китка + 1);

izm1 = (kuset1 <> kusobr1);

izm2 = (kuset2 <> kusobr2);

// гледам първо парче

Ако не, то izm1

strotf = TF. Добави ();

strotf. Започнете = (= 0. 1. rDelta rDelta);

strotf. Край = strotf. Като се започне + StrDlina (kusobr1) - 1;

strotf. EstRaznitsa = False;

// В противен случай, тази част е различна, отиде по-далеч от това лечение, както на отделен ред

rNachalo = (= 0. 1. rDelta rDelta);

= + RKonets rNachalo StrDlina (kusobr1) - 1;

Ако rNachalo = rKonets // След това крайната фаза, символът за разлика 1

strotf = TF. Добави ();

strotf. Започнете = rNachalo;

strotf. Край = rKonets;

strotf. EstRaznitsa = True;

PoluchitRazlichiyaDvuhStrok (kuset1 kusobr1 TF rDelta ...);

// Виж второто парче

rDelta = (Поузи + 1) + rDelta - (rDelta = 0. 0. 1) ?;

Ако не, то izm2

strotf = TF. Добави ();

strotf. Започнете = rDelta;

strotf. Край = strotf. Като се започне + StrDlina (kusobr2) - 1;

strotf. EstRaznitsa = False;

// В противен случай, тази част е различна, отиде по-далеч от това лечение, както на отделен ред

= + RKonets rNachalo StrDlina (kusobr2) - 1;

Ако rNachalo = rKonets // След това крайната фаза, символът за разлика 1

strotf = TF. Добави ();

strotf. Започнете = rNachalo;

strotf. Край = rKonets;

strotf. EstRaznitsa = True;

PoluchitRazlichiyaDvuhStrok (kuset2 kusobr2 TF rDelta ...);

// връща нищо, резултатът не е важен

Свързани статии

Подкрепете проекта - споделете линка, благодаря!