什么是计算字符串C ++中每个字母频率的最有效方法?

时间:2018-05-26 04:21:10

标签: c++ string

我被要求执行一项任务,以计算字符串中每个字母出现的次数。它假设所有字符都是按字母顺序排列的小写英文字母。此外,我应该按升序输出字符串字母,以及每个字母的频率。我使用std::set尝试这样做,如下面的代码:

#include <iostream>
#include <set>
#include <string>

int main() {
    std::string s;
    std::cin >> s;
    int cnt[26] = {};

    for (int i = 0; i < s.length(); i++) {
        cnt[s[i] - 'a']++;
    }
    std::set <char> st;
    for (int i = 0; i < s.length(); i++) {
        st.insert(s[i]);
    }
    for (auto x : st) {
        std::cout << x << " : " << cnt[x - 'a'] << std::endl;
    }

    return 0;
}

4 个答案:

答案 0 :(得分:2)

您可以省略std::set,只需这样写

int main() {
    std::string s;
    std::cin >> s;
    int cnt[26] = {};

    for (int i = 0; i < s.length(); i++) {
        cnt[s[i] - 'a']++;
    }
    for (int i = 0; i < 26; ++i) 
        if (cnt[i] > 0)
            std::cout << (char)('a' + i) << " : " << cnt[i] << std::endl;

    return 0;
}

而是保存在std::set中,我们检查cnt中是否存在字符,并在符号出现时输出。
此选项占用的内存较少。

答案 1 :(得分:2)

您可以使用std :: map,例如:

std::map<char, int> mymap;
for  (auto &c: s){
    mymap [c]++;
}

答案 2 :(得分:0)

#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
using namespace std;
bool sortbysec(const pair<int,int> &a,const pair<int,int> &b)
{
   return (a.second < b.second);
}
int main(){
   int len,cntS[26]={0},nonZero=0;
   string s;
   vector< pair<char,int> >v;
   cin>>s;
   len=s.length();
   for(int i=0;i<len;i++){
      cntS[s[i]-'a']++;
   }
   for(int i=0;i<26;i++){
      if(cntS[i]!=0){
        nonZero++;
        v.push_back(make_pair(char(i+'a'),cntS[i]));
      }
   }
   // Using sort() function to sort by 2nd element
  // of pair
  sort(v.begin(), v.end(), sortbysec);
  for(int i=0;i<v.size();i++){
      cout<<v[i].first<<v[i].second<<" ";
  }
  return 0;
}

enter image description here

答案 3 :(得分:0)

您可以使用地图存储key -> no occurances,然后将这些对移动到矢量和排序,代码如下:

std::vector<std::pair<char, int>> getSortedChars(std::string const& input) {
        std::map<char, int> m;
        std::vector<std::pair<char, int>> vp;
        for (char c : input) {
                ++m[c];
        }
        for (auto e : m) {
                vp.emplace_back(std::move(e));
        }
        std::sort(vp.begin(), vp.end(), [=](std::pair<char, int>& l, std::pair<char, int>& r) {
                return l.second < r.second;});
        return vp;
}

返回的矢量将具有排序对,然后您可以打印它们。