1 条题解

  • 0
    @ 2026-6-19 10:30:47

    📝 题目大意

    给定一个仅由小写英文字母组成的字符串 SS(长度 1000\leq 1000),找出出现次数最多的字符。若存在并列,则输出字母序最小的那个。

    💡 解题思路

    1. 题目分析:字符串仅包含 26 个小写字母,长度最多 1000,直接开一个大小为 26 的计数数组统计即可,无需任何优化。
    2. 算法推导
      • cnt[26] 数组,下标 00 对应 'a'2525 对应 'z'
      • 遍历字符串 SS,对每个字符 cc 执行 cnt[c - 'a']++ 统计频率。
      • 初始化 maxCount = 0ans = 'a'
      • i=025i = 0 \to 25(即从 'a''z')遍历 cnt 数组:
        • cnt[i] > maxCount严格大于)时才更新 maxCountans
      • 输出 ans
    3. 边界与细节
      • 使用 > 而非 >= 是关键:由于按字母序从小到大遍历,当后续字符出现次数与当前最大值相等时不会更新,从而自然保证"并列时取字母序最小"。
      • 若用 >= 则会输出字母序最大的那个,导致 WA。
      • 字符串长度至少为 11,无需考虑空串的特殊情况。

    ⏱️ 复杂度分析

    • 时间复杂度O(S)O(|S|),遍历字符串一次,再遍历固定大小的 26 个桶。
    • 空间复杂度O(1)O(1),仅需一个大小为 26 的数组。

    💻 标准代码 (C++)

    #include <iostream>
    #include <string>
    #include <vector>
    using namespace std;
    
    int main() {
        string S;
        cin >> S;
    
        // 统计 26 个小写字母的出现次数,下标 0 对应 'a'
        vector<int> cnt(26, 0);
        for (char c : S) {
            cnt[c - 'a']++;
        }
    
        int maxCount = 0;
        char ans = 'a';
        // 按字母序从小到大遍历,只有严格大于才更新,保证并列时取字母序最小
        for (int i = 0; i < 26; i++) {
            if (cnt[i] > maxCount) {
                maxCount = cnt[i];
                ans = 'a' + i;
            }
        }
    
        cout << ans << endl;
        return 0;
    }
    
    • 1

    信息

    ID
    772
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    (无)
    递交数
    1
    已通过
    1
    上传者