Помощь - Поиск - Пользователи - Календарь
Полная версия: Вот такая последовательность
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Tauka
Есть два предложения из простых смволов латынского алфавита.
Цель: надо найти найбольшую общую последовательность.

Например:
1. aacdgtserf
2. ascfde
Наибольшая общая последовательность тут будет "acde"
klem4
вот что-то типа, щас накатал, не оч рационально, но думаю идея правильная :

uses crt;
var s1,s2,s:string;
i,j,k,startj:integer;
flag:boolean;

Begin
clrscr;
readln(s1);
readln(s2);
k:=0;
i:=1;
startj:=1;
j:=startj;
while i<=length(s1) do
begin
j:=startj;
flag:=true;
while (j<=length(s2))and(flag) do
if s1[i]=s2[j] then
begin
flag:=false;
startj:=j+1;
inc(k);
s[k]:=s1[i];
inc(i);
end
else inc(j);
if flag then
inc(i);
end;

for i:=1 to k do
write(s[i]);
readln;
end.

volvo
Цитата(klem4 @ 28.04.05 9:58)
не оч рационально
:yes:
А если вместо

k := 0;
...
inc(k);
s[k]:=s1[i];
...

for i:=1 to k do
write(s[i]);


сделать вот так:

s := '';
...
s := s + s1[i];
...
writeln(s)


Логика программы не меняется, но по-моему это проще ...
Guest
1) axjx
2) satjx
выводит ax а должно ajx
volvo
Между прочим, тестовые примеры принято давать вместе с заданием... Тем более в таких "бредовых" заданиях...
virt
поищи алгоритм нудельмана - вунша.

добавил позже,
klem4
тебе осталось только подкорректировать, чтобы выводила большую из 2-х

теперь вроде привильно :low:

uses crt;
var s1,s2,s,sss:string;
i,j,k,startj,count:integer;
flag:boolean;

Begin
clrscr;
readln(s1);
readln(s2);
i:=1; count:=0;
startj:=1; j:=startj;
s:='';
repeat
while i<=length(s1) do
begin
j:=startj;
flag:=true;
while (j<=length(s2))and(flag) do
if s1[i]=s2[j] then
begin
flag:=false;
startj:=j+1;
s:=s+s1[i];
inc(i);
end
else inc(j);
if flag then
inc(i);
end;
writeln;
sss:=s1;
s1:=s2;
s2:=sss;
inc(count);
writeln(count,'>',s);
startj:=1;
j:=startj;
s:='';
i:=1;
until count=2;

readln;
end.


Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.