1 条题解

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

    📝 题目大意

    给定一个仅由小写英文字母组成的字符串 SS,判断它是否为"好字符串"。好字符串的定义是:对于所有整数 i1i \geq 1,在 SS 中恰好出现 ii 次的字符种类数必须为 0022(不能为其他值)。

    💡 解题思路

    1. 题目分析:字符串长度 1S1001 \leq |S| \leq 100,只有 2626 种小写字母,数据范围极小。核心任务是统计每种字符的出现次数,再统计"每种出现次数对应了多少种字符",最后验证这个"种类数"是否只可能是 0022

    2. 算法推导

      • 第一步——字符频率统计:用大小为 2626 的数组 cnt(下标 0~25 对应 a~z)统计每个字符在 SS 中出现的次数。遍历 SS 的每个字符 c,执行 cnt[c - 'a']++
      • 第二步——出现次数归类:题目关心的是"出现次数 ii 对应了多少种字符"。因此再开一个数组 freqCount,大小为 101101(因为 S100|S| \leq 100,任何字符出现次数不会超过 100100)。遍历 2626 个字母,若某个字母出现过(cnt[i] > 0),则 freqCount[cnt[i]]++,表示"出现次数恰好为 cnt[i] 的字符种类数"加一。
      • 第三步——合法性检查:遍历 ii11100100,检查 freqCount[i]。若 freqCount[i] 既不是 00 也不是 22,则不符合好字符串定义,直接输出 No 并结束。若全部检查通过,输出 Yes
    3. 边界与细节

      • 由于 SS 长度最小为 11,不会出现空串。
      • 出现 00 次的字符(即字符串中未出现的字母)不参与第二步的统计,因为只统计 cnt[i] > 0 的字母。
      • freqCount 数组大小至少为 101101S|S| 最大值 +1+1),用 vector<int>(101, 0) 初始化即可。
      • 注意:题目要求的是"恰好出现 ii 次的字符种类数",不是字符本身。不要混淆两层统计。

    ⏱️ 复杂度分析

    • 时间复杂度O(S+26+100)=O(S)O(|S| + 26 + 100) = O(|S|)。遍历字符串统计频率 O(S)O(|S|),遍历 2626 个字母 O(26)O(26),遍历 100100 个可能的出现次数 O(100)O(100),三者线性叠加。由于 S100|S| \leq 100,常数极小。
    • 空间复杂度O(26+101)=O(1)O(26 + 101) = O(1)cnt 数组大小 2626freqCount 数组大小 101101,均为常数级。

    💻 标准代码 (C++)

    #include <iostream>
    #include <string>
    #include <vector>
    using namespace std;
    
    int main() {
        string S;
        cin >> S;
    
        // cnt[i]:字母 i 在 S 中出现的次数(0=a, 1=b, ..., 25=z)
        vector<int> cnt(26, 0);
        for (char c : S) {
            cnt[c - 'a']++;
        }
    
        // freqCount[i]:出现次数恰好为 i 的字符种类数
        vector<int> freqCount(101, 0); // 长度最大100,出现次数最大100
        for (int i = 0; i < 26; i++) {
            if (cnt[i] > 0) {
                freqCount[cnt[i]]++;
            }
        }
    
        // 检查每个出现次数 i 对应的种类数是否为 0 或 2
        for (int i = 1; i <= 100; i++) {
            if (freqCount[i] != 0 && freqCount[i] != 2) {
                cout << "No" << endl;
                return 0;
            }
        }
    
        cout << "Yes" << endl;
        return 0;
    }
    
    • 1

    信息

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