Сайт Макса Пантюхина

Главная
Обо мне
Ссылки
Фотографии
SQL и не только
Резюме
Предыдущая
Следующая
Р - значит ракета

      

      

Определение, является ли фраза палиндромом или нет.

Я тут однажды проходил собеседование и мне предложили написать процедуру, проверяющую является ли фраза палиндромом или нет.

Палиндром - это такой текст, который одинаково читается от начала к концу и от конца к началу, не учитывая знаков препинания и пробелов.

В частности фразы:

А роза упала на лапу Азора. и
Madam, I’m Adam.

Для решения я использовал translate, чтобы отбросить знаки препинания и пробелы и написал вот так:

sDest := translate(upper(sSource),'ABCD...XYZАБВГ...ЭЮЯ', 'ABCD...XYZАБВГ...ЭЮЯ');

Потом читал sDest с конца и с начала и сравнивал - если равны - полиндром, если не равны - не палиндром. Ну эту часть кода я приводить не буду. Не в этом соль.

Меня спросили, а можно ли написать процедуру универсальную для разных языков. Ну хотя бы для европейских. Моя - то была заточена под английский и русский. В общем решения на собеседовании я не нашел.

Задал вопрос на sql.ru. (вот ссылочка). Обсуждение длилось два дня. Через два дня решение предложил Обросов А.

sDest := replace(translate(lower(sSource),upper(sSource),lpad('.',length(sSource),'.')),'.');

К своему решению я шел от вопроса "Как убрать знаки препинания?" и сразу начал убирать.

А он задал себе второй вопрос: "Чем знак препинания отличается от буквы?".
И почти сразу ответил: "знак препинания не зависит от регистра."

Ну а дальше все понятно.

Кому интересно почитать про палиндромы, вот ссылочка http://www.arbuz.uz/y_palind.html

 

 

Hosted by uCoz