10945. Мать медведица

 

По заданной входной строке определить, является ли она палиндромом.

 

Вход. Каждая строка содержит буквы латинского алфавита и знаки пунктуации. Последняя строка содержит слово “DONE” и не обрабатывается.

 

Выход. Для каждой строки определить, является ли она палиндромом игнорируя знаки пунктуации и регистр символов. Если строка является палиндромом, то вывести “You won't be eaten!”, иначе – “Uh oh..”.

 

Пример входа

Madam, Im adam!

Roma tibi subito motibus ibit amor.

Me so hungry!

Si nummi immunis

DONE

 

Пример выхода

You won't be eaten!

You won't be eaten!

Uh oh..

You won't be eaten!

 

 

РЕШЕНИЕ

обработка текста

 

Анализ алгоритма

Читаем входную строку. Удаляем из нее все лишнее, оставляя только символы латинского алфавита, которые сразу преобразовываем в нижний регистр. Далее движемся с начала и с конца по строке к ее середине, проверяя символы на совпадение.

 

Пример

Третий тест не является палиндромом.

 

Реализация алгоритма

Входную строку будем хранить в символьном массиве s.

 

char s[1000];

 

Читаем строку, проверяем ее на совпадение со словом “DONE”. Удалим из строки лишние символы. Переменная j будет содержать количество букв в строке, состоящей только из символов латинского алфавита нижнего регистра.

 

while(gets(s), strcmp(s,"DONE"))

{

  i = j = -1;

  while(s[++i])

    if (isalpha(s[i])) s[++j] = tolower(s[i]);

 

Установим i = 0. Переменная j указывает на последнюю букву слова. Сравниваем i - ую и j - ую буквы. Если они равны, то увеличиваем i и уменьшаем j на единицу. Продолжаем процесс сравнивания пока i < j. Если на каком-то этапе s[i] ¹ s[j], то входная строка не является палиндромом.

 

  for(i=0;i<j;i++,j--)

    if (s[i] != s[j]) break;

 

Выводим результат в зависимости от того, является ли входная строка палиндромом.

 

  if (i>=j) printf("You won't be eaten!\n");

       else printf("Uh oh..\n");

}