You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

统计小写字母出现次数并升序输出的实现与优化

嘿,你的这段代码思路很清晰,确实能完成统计字符串中小写字母出现次数并按升序输出的任务!先给你梳理下原代码的逻辑,再分享个更简洁高效的优化方案。

原代码分析

你的代码核心逻辑没问题:

  • 用int cnt[26] = {}初始化一个长度为26的数组,对应26个小写字母,通过s[i] - 'a'将字母映射到0-25的索引位置,遍历字符串完成次数统计。
  • 借助std::set自动排序的特性,插入字符串中的所有字符后,遍历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;
}

优化方案

其实咱们完全可以不用std::set,因为已知所有字符都是小写英文字母,直接从'a'到'z'遍历一遍索引,只要对应次数大于0就输出,天然就是升序排列,还能省去插入set的额外开销,代码也更简洁:

#include <iostream>
#include <string>

int main() {
    std::string s;
    std::cin >> s;
    int cnt[26] = {};
    
    // 用范围for循环遍历字符串,更简洁
    for (char c : s) {
        cnt[c - 'a']++;
    }
    
    // 直接遍历26个小写字母的索引,天然升序
    for (int i = 0; i < 26; ++i) {
        if (cnt[i] > 0) {
            std::cout << char('a' + i) << " : " << cnt[i] << std::endl;
        }
    }
    return 0;
}

这个优化后的代码做了两点改进:

  1. 使用范围for循环遍历字符串,比传统的索引循环更易读。
  2. 直接遍历0-25的索引,通过char('a' + i)转换回对应的字母,跳过次数为0的字母,既保证了升序,又避免了额外容器的使用,效率更高。

内容的提问来源于stack exchange,提问作者Anthony Watson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:53:30