Как проверить, являются ли два слова анаграммами на языке c

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

Мой наставник сказал мне, чтобы я посчитал, сколько первых букв в одном слове, затем сравнил с другим, а затем повторил для остальных букв. Поэтому, если слово доходит до конца, оно считает их анаграммами. Однако это все, с чем он мне помог, и я действительно борюсь с проблемой.

Программа должна распечатать, являются ли они анаграммами вроде этого,

Success! "Carthorse" and "Orchestra" are anagrams!

Изменить: спасибо, ребята, за все ваши ответы, хотя я понимаю всю идею, стоящую за ними, мне очень сложно поместить их в код, сможет ли кто-нибудь просто написать для меня аннотированный код? Это не домашнее задание или что-то в этом роде, это просто личный проект.


person Danthescotman    schedule 03.03.2015    source источник
comment
stackoverflow.com/questions/562303 / для краткого начала вам понадобится массив   -  person Mahmut Ali ÖZKURAN    schedule 04.03.2015
comment
Другой способ - присвоить карту (или, скорее, массив) каждого символа его счетчику. Увеличьте его для первого слова, уменьшите для второго, если оно заканчивается нулями, у вас есть анаграмма. Преимущество - предсказуемое время выполнения, но вы тратите немного памяти.   -  person tux3    schedule 04.03.2015
comment
@ tux3 По сути, как мой ответ и, возможно, более элегантно. Хороший.   -  person Alan    schedule 04.03.2015


Ответы (3)


Похоже, вы новичок в C! Добро пожаловать :)

Подобные задачи могут показаться сложными, поэтому первым делом я бы разбил их на шаги, которые вы можете решить в Google. Так:

"посчитайте, сколько в одном слове первых букв, затем сравните с другим, затем повторите до конца буквы"

  1. Прочтите слова / создайте для них переменные
  2. Создайте массив длиной 26 для хранения каждой буквы алфавита
  3. Прокрутите первое слово и для каждой буквы добавьте единицу к правильному индексу массива (a = 0, m = 12 и т. Д.), Например.

    int index = строка [i] - 'а'; // Это вычтет значение ascii из буквы, получив a = 0 и т. Д. LetterCounts [index] ++; // или letterCounts [index] -;

  4. Прокрутите второе слово и для каждой буквы вычтите единицу из индекса массива.

  5. Если в конце какой-либо индекс не равен 0, это не анаграмма.
person Beth Crane    schedule 03.03.2015
comment
Спасибо за быстрый ответ, и да, я новичок. Я понимаю шаги 1,2 и 5, но 3 и 4, я не уверен, как их реализовать - кто-нибудь хочет уточнить? - person Danthescotman; 04.03.2015
comment
Вам понадобится что-то вроде этого stackoverflow.com/questions/3213827/ для перебора строк. Я отредактировал приведенное выше для массивов - person Beth Crane; 04.03.2015

Преобразуйте обе строки в символы нижнего регистра.

Создайте два массива из 26 символов для букв алфавита.

Просмотрите каждую строку, считая буквы и увеличивая соответствующий элемент в массивах алфавита.

Затем сравните два алфавитных массива, и если они равны для каждого символа, ваши строки являются анаграммами.

person Alan    schedule 03.03.2015
comment
Спасибо за быстрый ответ! Да, все это имеет смысл, но моя проблема в том, что я действительно борюсь с тем, чтобы поместить все это в реальный код и реализовать его. - person Danthescotman; 04.03.2015
comment
Ответ @Dan BethCrane выше - правильный путь для работы. Это более подробная и элегантная версия моего ответа (занимает меньше места для хранения). - person Alan; 04.03.2015

1) При необходимости преобразуйте обе строки в нижний регистр (используйте tolower из ctype.h).

2) Отсортируйте каждую строку, например, используя qsort из stdlib.h:

static int cmp(const void *a, const void *b) { return *(char *)a - *(char *)b; }

qsort(str1, strlen(str1), 1, (cmp));
qsort(str2, strlen(str2), 1, (cmp));

3) Сравните отсортированные строки с strcmp из string.h - если они равны, они являются анаграммами, в противном случае - нет.

person Arkku    schedule 03.03.2015
comment
Вероятно, это решение с наименьшим количеством кода, которое вам нужно написать на C. Теоретически другое предлагаемое решение для подсчета вхождений букв работает быстрее, но это не имеет практического значения, когда строки имеют длину менее сотен тысяч символов. Если это домашнее задание, попробуйте оба решения, чтобы вы научились как делать это самостоятельно, так и использовать библиотечные функции (также попробуйте реализовать простой алгоритм сортировки, такой как сортировка по выбору или сортировка вставкой, и замените им библиотеку qsort). - person Arkku; 04.03.2015