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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.11.2011, 23:07   #1
daniil123
Пользователь
 
Регистрация: 19.09.2011
Сообщений: 23
По умолчанию Анаграмма

Слово называется анаграммой другого слова, если оно может быть получено перестановкой его букв.
Во входном файле два слова в отдельных строках. Длина каждого слова не превышает 255 символов.
В выходной файл выведите "YES" - если введенные слова являются анаграммами друг друга, и "NO" - в противном случае.
Пример:
SHARM YES
MARSH

ANANAS NO
NASA
daniil123 вне форума Ответить с цитированием
Старый 15.11.2011, 01:05   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

на форуме уже решалась такая задачка.
а алгоритм решения, как ни странно, прост, как топор:
проходим по всем буквам первого слова, находя для них точно такие же во втором слове. Если для какой-то буквы первого слова аналогичной не найдено - прерывание цикла, выход с "NO", если нашлась буква - то из второго слова её нужно удалить.
если дошли до конца 1-го слова без сбоев, тогда проверяем остаток во 2-м слове - если он пуст - ответ "YES", если во втором слове остались буквы - ответ "NO"



p.s. я тут алгоритм расписывал больше, чем писать полностью исходный код решения!

Последний раз редактировалось Serge_Bliznykov; 15.11.2011 в 08:40. Причина: подправил алгоритм, забыл указать про удаление буквы из второго слова. Спасибо за замечание TinMan.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 15.11.2011, 02:21   #3
TinMan
Форумчанин
 
Аватар для TinMan
 
Регистрация: 05.09.2011
Сообщений: 869
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
проходим по всем буквам первого слова, находя для них точно такие же во втором слове. Если для какой-то буквы первого слова аналогичной не найдено - прерывание цикла, выход с "NO"
если дошли до конца 1-го слова без сбоев, тогда проверяем остаток во 2-м слове - если он пуст - ответ "YES", если во втором слове остались буквы - ответ "NO"[/I]
Тут не совсем ясно сказано, небольшое уточнение: после нахождения буквы во втором слове, ее надо оттуда убрать.

Но я бы поступил проще: отсортировал бы оба слова и сравнил. Если равны - значит, анаграмма..
Предпочитаю на "ты".
TinMan вне форума Ответить с цитированием
Старый 15.11.2011, 07:26   #4
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

При этом, кстати, сразу (перед сортировкой) можно сравнить длину слов. Если она разная, значит NO. В противном случае работаем дальше.
Вадим Мошев вне форума Ответить с цитированием
Старый 15.11.2011, 08:47   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Вадим Мошев, да, согласен. это несложно и сразу отсеет заведомо неверные варианты!

TinMan, ну, можно и так, просто мне показалось, что вариант без сортировки проще (ведь в Паскаль/Delphi нет встроенных методов сортировки), да и эффективнее. Чем сортировать 255 символов, программа может уже завершить работу на первых же проверках...
ладно. раз пошла такая пьянка, то вот код решения:
Код:
if length(s1)<>(s2) then WriteLn('NO')
else begin
  for i:=1 to length(s1) do begin
    k := Pos(s1[i], s2);
    if k>0 then Delete(s2, k, 1)
    else Break;
  end;
  if Length(s2)>0 then Writeln('NO')
  else Writeln('YES');
end;
p.s. не проверял, но идея, надеюсь, понятна...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 15.11.2011, 10:06   #6
TinMan
Форумчанин
 
Аватар для TinMan
 
Регистрация: 05.09.2011
Сообщений: 869
По умолчанию

Я совершенно согласен со всеми доводами . Конечно, двойная сортировка не очень эффективна, она годится скорее для PHP etc. Да и простота тут весьма условна, только при наличии библиотечных процедур для сортировки..

Интересно, что если наложить условие, что слова непусты (или считать, что пустота пустоте не анаграмма, что не лишено сермяжного смысла)), то можно избавиться от двойного вывода 'NO' в приведенном коде.
Предпочитаю на "ты".
TinMan вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
анаграмма Витас Помощь студентам 1 02.11.2010 18:50
[С++] Анаграмма Nikita_M Помощь студентам 1 25.10.2010 21:46
Анаграмма Djeka(c) Помощь студентам 1 16.09.2010 22:15