我认为您可以存储一个字母计数器作为std::map<char, int>示例。然后你只需遍历你的字符串,如果计数器已经包含 current char,你增加它,否则你添加它并将值设置为零。
然后:
- 搜索最高计数值:您将获得最常见的字母。
- 擦除地图中的相应元素。
- 再次搜索最高计数值:您将获得第二频繁的字母。
下面的例子应该更明确:
#include <map>
#include <algorithm>
bool compare(const std::pair<char, int> & a, const std::pair<char, int> & b)
{
return (a.second < b.second);
}
bool most_frequent_letter(const std::string & str, std::pair<char, char> & results)
{
if(str.length() >= 2)
{
std::map<char, int> counter;
for(const char & c : str)
++counter[c];
std::map<char, int>::const_iterator it_max = std::max_element(counter.cbegin(), counter.cend(), &compare);
char c_max = it_max->first;
counter.erase(it_max);
it_max = std::max_element(counter.cbegin(), counter.cend(), &compare);
char c_second = it_max->first;
results = std::make_pair(c_max, c_second);
return true;
}
else
return false;
}
该函数most_frequent_letter()接收期望std::string的和std::pair<char, char>对存储字符串中最常见和第二常见的字母的位置的引用。
它返回一个布尔值,其值等于 true 是否可以执行搜索,否则返回 false。
您可以通过以下方式找回它们:
// Create a string
std::string test_string("Hello world");
// Find the two most frequent letters
std::pair <char, char> most_frequents;
bool success = most_frequent_letter(test_string, most_frequents);
// Get them
char most, second_most;
if(success)
{
most = most_frequents.first; // first --> most frequent
second_most = most_frequents.second; // second --> second most frequent
}
我对其进行了测试,并且成功运行。
我试图使这个例子尽可能简单,我希望它会有所帮助。