![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| starmaster |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 149 Регистрация: 29.3.2004 Репутация: нет Всего: нет |
Столкнулся с такой задачей: как в двух строках найти наибольшую общую подстроку.
Например: Вход: abcdef bbcdm Выход: bcd Пытался написать программу, но у меня получалась проблема в тех строках, у которых несколько одинаковых букв |
|||
|
||||
| VIY |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 13.10.2004 Репутация: нет Всего: нет |
Общие подстроки должны быть на техже местах или могут быть на разных:
abcdef fdbcd34 выход: bcd ? |
|||
|
||||
| VIY |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 13.10.2004 Репутация: нет Всего: нет |
function compare(S1,S2:string):string;
var i,j,L1,L2,max:Integer; Tmp:String; begin L1:=Length(S1); L2:=Length(S2); if L1<L2 then begin Result:=''; j:=0; max:=0; Tmp:=''; for i:=1 to L1 do begin if S1[i]=S2[i] then begin inc(j); Tmp:=Tmp+S1[i]; if j>max then begin Result:=Tmp; max:=j; end; end else begin j:=0; Tmp:=''; end; end; end else Result:=compare(S2,S1); end; |
|||
|
||||
| Vladimir13 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 208 Регистрация: 8.12.2004 Где: Волгоград, Россия Репутация: 1 Всего: 1 |
или:
repeat begin a:=copy(s1,i,1); b:=copy(s2,i,1); if a=b then begin a1:=copy(s1,i+1,1); b1:=copy(s2,i+1,1); if a1=b1 then... until i<=Length(s1); Долго, много писать, но тоже способ --------------------
Лучший метод - метод тыкаобращаться по адресу: mvdr |
|||
|
||||
| Zero |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2169 Регистрация: 23.10.2004 Где: Россия, г. Рязань Репутация: 8 Всего: 24 |
starmaster, поясни задание... Я тоже непонял этого...
Если они могут быть на разных то будет много гемора, а если наибольшие общие строки имеют одну нумерацию символов, то легко. Это сообщение отредактировал(а) Zero - 9.12.2004, 19:16 |
|||
|
||||
| Bes |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 806 Регистрация: 8.12.2004 Репутация: 5 Всего: 7 |
У меня вроде бы работает вот такой код.
function TForm1.Cross(const S1, S2: string): string; Var Sb,Sm,Ss,Sr:string; i,j:integer; begin if length(S1)>length(S2) then begin Sb:=S1; Sm:=S2; end else begin Sm:=S1; Sb:=S2; end; Sr:=''; for i:=1 to length(Sm) do for j:=1 to length(Sm)-i+1 do begin ss:=copy(Sm,i,j); if (pos(ss,Sb)>0) and (length(ss)>length(Sr)) then Sr:=ss; end; Result:=Sr; end; |
|||
|
||||
| Fedor |
|
|||
![]() Днепрянин ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2090 Регистрация: 8.2.2003 Где: Великий Репутация: нет Всего: 32 |
На самом деле - стандартный алгоритм динамического программирования LCS - Longest Common Subsequence
Добавлено @ 13:26 З.Ы. Код на пакале, так что если нужно в Делфи, измени ввод-вывод строк -------------------- Мы - Днепряне. Мы всех сильней. |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |