Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Строки, общая подстрока 
:(
    Опции темы
starmaster
  Дата 1.11.2004, 19:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 29.3.2004

Репутация: нет
Всего: нет



Столкнулся с такой задачей: как в двух строках найти наибольшую общую подстроку.
Например:
Вход:

abcdef
bbcdm

Выход:
bcd

Пытался написать программу, но у меня получалась проблема в тех строках, у которых несколько одинаковых букв :(

PM MAIL WWW ICQ   Вверх
VIY
Дата 3.11.2004, 08:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 13.10.2004

Репутация: нет
Всего: нет



Общие подстроки должны быть на техже местах или могут быть на разных:

abcdef

fdbcd34

выход:

bcd

?
PM MAIL   Вверх
VIY
Дата 3.11.2004, 09:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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;
PM MAIL   Вверх
Vladimir13
Дата 9.12.2004, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 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
PM MAIL ICQ   Вверх
Zero
Дата 9.12.2004, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2169
Регистрация: 23.10.2004
Где: Россия, г. Рязань

Репутация: 8
Всего: 24



starmaster, поясни задание... Я тоже непонял этого...
Цитата(VIY @ 3.11.2004, 08:54)
Общие подстроки должны быть на техже местах или могут быть на разных:

Если они могут быть на разных то будет много гемора, а если наибольшие общие строки имеют одну нумерацию символов, то легко.

Это сообщение отредактировал(а) Zero - 9.12.2004, 19:16
PM MAIL ICQ   Вверх
Bes
Дата 11.12.2004, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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;
PM MAIL   Вверх
Fedor
Дата 11.12.2004, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Днепрянин
****


Профиль
Группа: Участник
Сообщений: 2090
Регистрация: 8.2.2003
Где: Великий

Репутация: нет
Всего: 32



На самом деле - стандартный алгоритм динамического программирования LCS - Longest Common Subsequence

Код

program LCS;  {Longest Common Subsequence}
var
s1,s2,s:string;
i,j,n1,n2:word;
L:array[0..100,0..100] of word;
fin,fout:text;
function max(d1,d2:word):word;
var max1:word;
begin
 max1:=d1;
 if d2>max1 then max1:=d2;
 max:=max1;
end;

begin
assign(fin,'LCS.dat');reset(fin);
readln(fin,s1); readln(fin,s2);
close(fin);
n1:=length(s1); n2:=length(s2);
{===============================}
for i:=0 to n1 do
 for j:=0 to n2 do
  L[i,j]:=0;
{===============================}
for i:=1 to n1 do
 for j:=1 to n2 do begin
  if i*j = 0 then L[i,j]:=0 else
  if s1[i] = s2[j] then L[i,j]:=L[i-1,j-1] +1 else
  L[i,j]:=max(L[i,j-1],L[i-1,j]);
                   end;
{===============================}
i:=n1; j:=n2;
while i*j<>0 do begin
 if s1[i] = s2[j] then begin s:=s1[i] + s; i:=i-1; j:=j-1; end else
 if L[i,j-1] >L[i-1,j] then j:=j-1 else i:=i-1;
                end;
{===============================}
assign(fout,'LCS.sol');rewrite(fout);
writeln(fout,L[n1,n2]);
writeln(fout,s);
close(fout);
end.

Добавлено @ 13:26
З.Ы. Код на пакале, так что если нужно в Делфи, измени ввод-вывод строк


--------------------
Мы - Днепряне. Мы всех сильней.
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0508 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.