Помощь - Поиск - Пользователи - Календарь
Полная версия: Рекуррентные соотношения
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
passat
Даны две строки символов. Длина строки указана.
Первую строку можно менять циклически (т.е. перставлять начальный символ в конец строки).

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

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

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

{$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.
volvo
Андрей, вот так не проще?
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
Хах))) Щас чуть такое же решение не запостил))) Да, на счет строк больше 127 тут засада.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.