基于插入顺序的第一个最重复的单词

时间:2017-10-24 20:23:35

标签: c++ algorithm

我按顺序在字符串中插入了一堆单词。现在,我想找到最重复的词。如果存在平局,请使用前面的单词。

代码:https://ideone.com/S5yOBk

#include <iostream>
#include <map>
#include <sstream>
using namespace std;

int main()
{
    string line = "paper block book chair";
    map<string, int> frequencyMap;

        istringstream stream(line);
        string word;

        while (stream >> word)
        {
            ++frequencyMap[word];
        }

        string maxRep; int c = 0;
        for (auto& t : frequencyMap) {
            if (t.second > c) {
                maxRep = t.first;
                c = t.second;
            }
        }

    cout << "First Most repeated word is: " << maxRep << endl;
}

在这种情况下,预期输出是“纸”,但我一直在“阻止”。

2 个答案:

答案 0 :(得分:3)

您无法根据在地图中插入元素的顺序来决定哪个元素首先出现在地图中。您应该考虑使用其他字段来了解哪个字段会保留插入顺序。

有一个简单的解决方案: -

#include <iostream>
#include <map>
#include <sstream>
using namespace std;

int main()
{
    string line = "paper block book chair";
    map<string, pair<int,int>> frequencyMap;

        istringstream stream(line);
        string word;
        int i = 0;
        while (stream >> word)
        {
            if(frequencyMap.count(word)==0)
             frequencyMap[word]=pair<int,int>(i++,1);
            else
                frequencyMap[word].second++;
        }

    string maxRep; int c = 0,ord=10000000;// max elements inserted+1
    for (auto& t : frequencyMap) {
        if (t.second.second > c ||(t.second.second==c && t.second.first < ord)) {
            maxRep = t.first;
            ord = t.second.first;
            c = t.second.second;
        }
    }

    cout << "First Most repeated word is: " << maxRep << endl;
}
Output: 
paper

答案 1 :(得分:1)

std :: map基于某种BST,它存储的每个第一类都应该有“opetator&lt;”来使BST有序。 std :: string是lexicographicaly。

您可以编写一个包含字符串及其插入时间的新类,按插入时间比较每两个元素,因此std :: map按插入时间排序。

<强> UPD

我重新考虑这个问题并发现你只需要记录每个字符串发生的次数并保持最大次数。如果某些字符串出现的时间大于我们之前记录的最大次数,我们会更新最大次数并将答案更改为此字符串。