IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Рекуррентные соотношения
passat
сообщение 20.02.2009 16:04
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 32
Пол: Мужской

Репутация: -  0  +


Даны две строки символов. Длина строки указана.
Первую строку можно менять циклически (т.е. перставлять начальный символ в конец строки).

Выяснить, можно ли получить вторую строку из первой путем циклической перестановки и, если можно, указать количество перестановок.

Придумал 2 алгоритма:
1) Поиск последовательности символов второй строки в первой. Но не осилил рекуррентное соотношение.
2) Собственно перестановка с проверкой строки целиком. Тут вообще нет рекуррентного соотношения. Да и выполняться будет наверное медленно.

Может кто подскажет более интересный способ. Желательно с рекуррентной формулой.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
klem4
сообщение 20.02.2009 23:15
Сообщение #2


Perl. Just code it!
******

Группа: Модераторы
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


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

{$mode tp}
{$b-}
uses crt;

function foo( s, pattern: string ): integer;
var
i, j, start: byte;
changes: integer;

begin
if length(s) <> length(pattern) then exit(-1);
i := 1;
changes := -1;
while ( i <= length(s) ) and ( changes = -1 ) do begin
while ( i <= length(s) ) and ( s[i] <> pattern[1] ) do inc(i);
if i <= length(s) then begin
j := 2;
start := i;
inc(i);
if ( i > length(s) ) then i := 1;
while ( s[i] = pattern[j] )
and ( j <= length(pattern) )
and ( i <> start ) do begin
inc(j);
if ( i < length(s) ) then inc(i) else i := 1;
end;
if j > length( pattern ) then changes := start-1 else i := start + 1;
end;
end;
foo := changes;
end;

var
a, b: string;
begin
clrscr;
a := 'abcd';
b := 'dabc';
writeln( foo( a, b) );
end.


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 21.02.2009 1:27
Сообщение #3


Гость






Андрей, вот так не проще?
function check(s, patt: string): integer;
begin
if length(s) <> length(patt) then check := -1
else check := pos(patt, s + s) - 1;
end;

var
s, patt: string;

begin
s := 'abcd';
patt := 'bcda';
writeln(check(s, patt));
end.

Только рекуррентностью тут и не пахнет... При длине строки > 127 начнутся проблемы при использовании компилятора TP...
 К началу страницы 
+ Ответить 
klem4
сообщение 21.02.2009 14:48
Сообщение #4


Perl. Just code it!
******

Группа: Модераторы
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Хах))) Щас чуть такое же решение не запостил))) Да, на счет строк больше 127 тут засада.

Сообщение отредактировано: klem4 - 21.02.2009 14:49


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 18.06.2025 6:34
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"