Страницы

Поиск по вопросам

суббота, 7 марта 2020 г.

Как подсчитать количество уникальных слов в массиве?

#cpp


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


Ответы

Ответ 1



Применять set или unordered_set для небольших наборов - палить из пушки по воробьям. Кстати, вопрос сравнения методов выделения уникальных записей (правда, не для строк) уже поднимался и рассматривался здесь. Здесь эффективнее записать все указатели на слова в массив, отсортировать и вернуть уникальные, что-то вроде int main() { const char * delimeters = " \t,."; // Решите сами, что вам нужно char s[] = "aaa bbb ccc ddd aaa ddd ccc ggg"; vector ptrs; for(char* w = strtok(s,delimeters); w; w = strtok(nullptr,delimeters)) ptrs.push_back(w); sort(ptrs.begin(), ptrs.end(), [](const char* a,const char* b){ return strcmp(a,b) < 0; }); cout << distance(ptrs.begin(), unique(ptrs.begin(),ptrs.end(), [](const char* a,const char* b){ return strcmp(a,b) == 0; })) << endl; } Но, как я понимаю, сейчас ваши преподы требуют от вас простых решений, не использующих все эти премудрости с STL. Например, такие: int main() { const char * delimeters = " \t,."; // Решите сами, что вам нужно char s[] = "aaa bbb ccc ddd aaa ddd ccc ggg"; char * words[50]; // Ну, заведомо больше, чем слов... int n = 0; for(char* w = strtok(s,delimeters); w; w = strtok(nullptr,delimeters)) words[n++] = w; int count = 0; for(int i = 0; i < n; ++i) { ++count; for(int j = 0; j < i; ++j) if (strcmp(words[i],words[j]) == 0) { --count; break; } } cout << count << endl; } При небольших наборах слов работать будет очень быстро...

Ответ 2



Наивная реализация может выглядеть как-то так: char arr[] = "aaa bbb,aa, bbb\ta aa bb"; //исходный массив со словами unordered_set uniqWords;//сюда будем вставлять слова - set это такой контейнер, который хранит только уникальные значения char *token = strtok(arr, " \t,.:;\r\n!?"); //начинаем разбивку на токены: слова могут разделяться пробелами, табуляцией, знаками препинания while (token != NULL) { uniqWords.insert(token); token = strtok(NULL, " "); } //выводим кол-во уникальных cout << "Unique words = " << uniqWords.size() << '\n'; Полный пример можно запустить здесь

Комментариев нет:

Отправить комментарий