Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.09.2010, 17:35   #1
RAVAL(c)
Пользователь
 
Регистрация: 05.09.2010
Сообщений: 31
Вопрос Антипалиндром (pascal)

Здравствуйте!Помогите, пожалуйста!

Задача:
Вывести антипалиндром (не перевертыш) максимальной длинны.
(если все подстроки - палиндромы, вывести "NO SOLUTION"
Пр.
Ввод: abba
Вывод: abb


Вот мой код:
Код:
VAR
  d,l,i : Longint;
  s,f  : AnsiString;
BEGIN
  ReadLn(s);
  d:=Length(s);
  f:='';
  While f<>s Do
    Begin
      i:=1;
      While i<=d Do
        Begin
         f:=s[i]+f;
         Inc(i);
        End;
      If f=s
        Then
          Begin
            Delete(s,d,1);
            Dec(d);
            f:='';
            i:=0;
            If s=''
             Then
               Begin
                 WriteLn('NO SOLUTION');
                 Halt;
               End;
          End
        Else Break;
    End;
    WriteLn(s);
END.
У меня не проходит по времени. Можно как-нибудь ускорить?
Ну или "накройняк" подскажите другой способ решения.
RAVAL(c) вне форума Ответить с цитированием
Старый 05.09.2010, 18:36   #2
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

У тебя не то чтобы по времени не проходит, у тебя она в принципе неправильно работает: ввожу abba и мне выдаёт "abba". На твоём месте я бы сделал отдельную процедуру проверки строки на палиндромичность, и потом уже всё остальное.
_-Re@l-_ вне форума Ответить с цитированием
Старый 05.09.2010, 19:36   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

вот мой вариант. просто тупой перебор...
Код:
function isPalindrom(const ss : string) : boolean;
var i, k : integer;
begin
  i := 1;
  k := length(ss);
  while (i<= (k div 2)) and 
    ( ss[i] = ss[k-i+1]) do inc(i);
  isPalindrom := i>(k div 2);
end;

var 
 s : string;
 i, k : integer;
 isFound : boolean;
begin
  s := 'abba';

  isFound := false;
  for k:=length(s) downto 2 do begin
    for i:=1 to length(s)-k+1 do
      if Not isPalindrom(Copy(s,i,k)) then begin
        WriteLn('Found: '+Copy(s,i,k));
        isFound := true;
        Break;
      end;
    if isFound then Break;
  end;

  if Not isFound then WriteLn('NO SOLUTION!');

end.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Turbo Pascal or Pascal ABC Ikram Паскаль, Turbo Pascal, PascalABC.NET 0 27.04.2010 13:44
а free pascal не читает задачи которые написаны на turbo pascal? demonara Паскаль, Turbo Pascal, PascalABC.NET 3 25.05.2009 16:28
Перевод кода из Pascal в Object Pascal zemskov77 Общие вопросы Delphi 1 03.01.2009 09:37
Need help, Pascal Бедный студент Помощь студентам 0 31.05.2008 01:38