1 条题解

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

    📝 题目大意

    给定一个长度为 33 的字符串 SS(仅含小写字母),找出 SS 中恰好出现一次的任意字符并输出;若所有字符都出现超过一次,则输出 1-1

    💡 解题思路

    1. 题目分析:字符串长度固定为 33,只有小写字母,数据规模极小。本质上是一个简单的字符频率统计问题。隐藏条件:若存在多个只出现一次的字符,输出任意一个即可。

    2. 算法推导

      • 使用一个大小为 256256 的整型数组 cnt(覆盖所有 ASCII 字符,直接以字符 ASCII 码作为下标)统计每个字符的出现次数。
      • 第一遍遍历字符串 SS,对每个字符 c 执行 cnt[c]++ 完成频率统计。
      • 第二遍遍历字符串 SS,按原顺序检查每个字符:若 cnt[c] == 1,说明该字符仅出现一次,直接输出并 return 0 结束程序。
      • 若两遍遍历后仍未找到,说明所有字符均重复出现,输出 1-1
    3. 边界与细节

      • 字符串长度恒为 33,不存在空串。三种情况:三个字符各不相同(如 abc,每个都出现一次,输出第一个 a);恰好两个相同(如 popo 出现一次,输出 o);三个全部相同(如 xxx,无唯一字符,输出 1-1)。
      • 数组大小 256256 足够覆盖所有小写字母的 ASCII 码,无需映射到 00~2525
      • 注意 cnt 数组需初始化为 00(使用 int cnt[256]={0} 即可)。

    ⏱️ 复杂度分析

    • 时间复杂度O(N)O(N),其中 N=3N=3,两遍遍历,常数级。
    • 空间复杂度O(1)O(1)cnt 数组大小为常数 256256

    💻 标准代码 (C++)

    #include<bits/stdc++.h>
    using namespace std;
    int main(){
        string s;
        cin >> s;
        // 统计每个字符的出现次数,ASCII码作为下标
        int cnt[256] = {0};
        for(char c : s){
            cnt[c]++;
        }
        // 按原字符串顺序遍历,找到第一个出现次数为1的字符
        for(char c : s) {
            if(cnt[c] == 1) {
                cout << c << endl;
                return 0;
            }
        }
        // 没有唯一字符,输出-1
        cout << -1 << endl;
        return 0;
    }
    
    • 1

    信息

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