Вывести на экран все слова, в которых имеется максимальное количество различных букв - C (СИ)
Формулировка задачи:
Дана последовательность символов, состоящая из слов. Вывести на экран все слова, в которых имеется максимальное количество различных букв.
Решение задачи: «Вывести на экран все слова, в которых имеется максимальное количество различных букв»
textual
Листинг программы
#include <stdio.h>
#include <glib.h>
size_t dif_letters(const char * s) {
GHashTable * hash = g_hash_table_new(g_direct_hash, g_direct_equal);
size_t cnt = 0;
for ( ; *s; ++s )
g_hash_table_insert(hash, GINT_TO_POINTER((int)*s), NULL);
cnt = g_hash_table_size(hash);
g_hash_table_destroy(hash);
return cnt;
}
int keycmp(const void * pa, const void * pb) {
size_t a = GPOINTER_TO_SIZE(pa);
size_t b = GPOINTER_TO_SIZE(pb);
return ( a < b ) - ( a > b );
}
gboolean print_words(void * k, GHashTable * words, void * dummy) {
void * key, * val;
GHashTableIter iter;
g_hash_table_iter_init(&iter, words);
while ( g_hash_table_iter_next(&iter, &key, &val) )
g_print("%s ", (char*)key);
g_print("\n");
return TRUE;
}
gboolean remove_hashes(void * key, GHashTable * hash, void * dummy) {
g_hash_table_destroy(hash);
return FALSE;
}
#define DELIM " \t\n"
int main(void) {
char buf[BUFSIZ];
while ( printf("String: ") && fgets(buf, BUFSIZ, stdin) && *buf != '\n' ) {
char ** words, ** ptr;
GTree * tree;
size_t letters;
words = g_strsplit_set(buf, DELIM, -1);
tree = g_tree_new(keycmp);
for ( ptr = words; *ptr; ++ptr ) {
if ( **ptr ) {
letters = dif_letters(*ptr);
GHashTable * hash = g_tree_lookup(tree, GSIZE_TO_POINTER(letters));
if ( ! hash ) {
hash = g_hash_table_new(g_str_hash, g_str_equal);
g_tree_insert(tree, GSIZE_TO_POINTER(letters), hash);
}
g_hash_table_insert(hash, *ptr, NULL);
}
}
printf("Word(s) with max different letters:\n");
g_tree_foreach(tree, (GTraverseFunc)print_words, NULL);
g_tree_foreach(tree, (GTraverseFunc)remove_hashes, NULL);
g_tree_destroy(tree);
g_strfreev(words);
}
return 0;
}
Объяснение кода листинга программы
- Ввод строки от пользователя
- Разделение строки на слова с помощью функции
g_strsplit_set - Создание дерева с помощью функции
g_tree_newи сравнение элементов в нем с помощью функцииkeycmp - Для каждого слова в строке:
- Вычисление количества различных букв в слове с помощью функции
dif_letters - Поиск хеш-таблицы в дереве, которая содержит слова с таким количеством различных букв
- Если хеш-таблицы нет, то ее создание и добавление в дерево
- Добавление слова в найденную хеш-таблицу
- Вычисление количества различных букв в слове с помощью функции
- Вывод на экран всех слов с максимальным количеством различных букв с помощью функции
print_words - Удаление всех хеш-таблиц из дерева с помощью функции
remove_hashes - Выход из программы с помощью функции
g_tree_destroyиg_strfreev