


Помогите с решением задачи C++. Подводные камни map.
#include <iostream>
#include <string>
using namespace std;
bool CheckAnagram(const string& s1, const string& s2) {
// напишите решение тут
}
// напишем небольшую функцию для проверки
void CheckIsTrue(bool value) {
if (value) {
cout << "Test passed :)"s << endl;
} else {
cout << "Test failed :("s << endl;
}
}
int main() {
CheckIsTrue(CheckAnagram("tea"s, "eat"s));
CheckIsTrue(!CheckAnagram("battle"s, "beatle"s));
CheckIsTrue(!CheckAnagram("lift"s, "elevator"s));
CheckIsTrue(CheckAnagram("ocean"s, "canoe"s));
}
Задание
Слова называются анаграммами, если одно из них можно получить перестановкой букв в другом. Например, “eat” и “tea” — анаграммы, потому что состоят из одних и тех же букв в разном порядке.
Слова “battle” и “beatle” — не анаграммы. В первом две буквы “t”, а во втором две “e”.
Напишите функцию CheckAnagram, которая принимает два слова и возвращает true, если они анаграммы.
Как будет тестироваться ваша программа
Тесты проверят правильную работу функции CheckAnagram.
В качестве параметров будут передаваться слова, целиком состоящие из строчных английских букв.
Функция main, которую вы напишете, учитываться не будет.
Ограничения
Ничего не выводите в cout и не читайте из cin.
Не меняйте название функции — CheckAnagram.
Примеры
Слова hare и rhea. Результат true.
Слова battle и beatle. Результат false.
Слова eat и tea. Результат true.
Слова lift и elevator. Результат false.
Для каждого из двух слов создайте словарь, который сопоставит каждому символу количеству его вхождений в слово.
Чтобы создать такой словарь, нужно посчитать символы. Это делается по аналогии с тем, как считались звери в уроке. Нужно пройтись циклом range-based for по символам строки. Получится map<char, int>.
Чтобы упростить себе задачу, создайте самостоятельно функцию, которая по слову строит словарь, считающий буквы.
В конце сравните словари обоих слов операцией ==: если слова — анаграммы, словари получатся одинаковые.
bool CheckAnagram (string& word1, string& word2){
map < char, int > slovar1;
map < char, int > slovar2;
for (char& ch: word1) {
if (!slovar1.count(ch)) slovar1[ch] = 1; else slovar1[ch]++;}
for (char& ch: word2) {
if (!slovar2.count(ch)) slovar2[ch] = 1; else slovar2[ch]++;}
return slovar1==slovar2;}
https://www.onlinegdb.com/
Ключевая функция проверки на анаграмму (по сути однострочник =):
map - пфф =)
bool isA(const string& s1, const string& s2) {
return multiset< char >(s1.begin(), s1.end())==multiset < char >(s2.begin(),s2.end());
}
ЗЫЖ vector,utility нужны только для тестирования. тестирование тоже должно быть автоматизировано, а не каждый раз писать в коде Check....
