Поиск наиболее (множественного) распространенного слова в C с использованием подхода unordered_map

#c #debugging #unordered-map

#c #отладка #неупорядоченная карта

Вопрос:

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

Мои слова метода для 21/24 тестовых случаев, я, кажется, не могу вспомнить 3 тестовых случая, которые мне не хватает.

Я добавляю код, который у меня есть прямо сейчас, который, по моему мнению, эффективен. Я не хочу другого способа его реализации прямо сейчас (хотя предложения приветствуются), я просто хотел бы пораскинуть мозгами о возможных тестовых примерах, которые я пропускаю.

  vector<string> mostCommonWord(string paragraph, vector<string>amp; banned) {
        unordered_map<string, int>m;


       for(int i = 0; i < paragraph.size();){
            string s = "";
            while(i < paragraph.size() amp;amp; isalpha(paragraph[i])) s.push_back(tolower(paragraph[i  ]));  // go through till you find one word completely
            while(i < paragraph.size() amp;amp; !isalpha(paragraph[i])) i  ; // avoid all the white spaces and other characters
            m[s]  ; // include the word found and increment its count
        }
        for(auto x: banned) m[x] = 0; // make the count of all the banned words to be 0

        vector<string> resu<
        string res = "";
        int count = INT_MIN;
        // find the maximum count
        for(auto x: m)
            if(x.second > count) count = x.second;
        // we might have the case where all the words were in banned words, which would result the count == -1, so return an empty vector in this case
        if(count <= 0) return resu<
        // add the words corresponding to that to the final vector<string>
        for(auto x: m)
            if(x.second == count) result.push_back(x.first);
        return resu<  
    }
  

Это работает для всех сценариев, которые я могу придумать, но не удается выполнить 3 тестовых примера.
Мне не предоставлен доступ к этим тестовым примерам, я просто хотел бы обсудить, что это могло бы быть!

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

1. for (const autoamp; x: banned) m.erase(x); кажется лучше, обрабатывает абзац только с запрещенными словами.

Ответ №1:

  1. Вы уверены в том, что другие символы (цифры) следует рассматривать как разделители слов?
  2. Если paragraph начинается с пробела или не с алфавитного символа, вы вставите пустую строку в карту: m[""] = 1 .

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

1. На самом деле это очень хорошее наблюдение! Спасибо. Какие-либо другие сценарии, которые вы можете придумать? И да, в качестве слов рассматриваются только английские алфавиты!