题解:洛谷 AT_abc426_b The Odd One Out

【题目来源】

洛谷:AT_abc426_b [ABC426B] The Odd One Out - 洛谷

【题目描述】

给定一个长度至少为 \(3\) 的字符串 \(S\),该字符串仅由小写英文字母组成。
\(S\) 恰好包含两种不同的字符,且正好有一个字符与其他字符不同。请找出那个与众不同的字符。

例如,如果 \(S\)odd,请输出 o

【输入】

输入从标准输入给出,格式如下:

\(S\)

【输出】

输出答案。

【输入样例】

odd

【输出样例】

o

【核心思想】

  1. 问题分析:给定长度至少为 \(3\) 的字符串 \(S\),仅包含两种不同字符,且恰好有一个字符出现一次、其余字符均出现多次。需要找出那个仅出现一次的字符。这是一个字符频率统计问题,关键在于利用 map 统计每个字符出现次数,然后定位频率为 \(1\) 的字符。

  2. 算法选择

    • 哈希映射统计:用 map<char, int> 遍历字符串统计每个字符出现频率
    • 频率筛选:遍历字母表 az,找到第一个频率为 \(1\) 的字符即为答案
  3. 关键步骤

    • 读取输入:读入字符串 \(S\)
    • 频率统计:遍历 \(S\) 中每个字符 \(c\),执行 \(mp[c] \mathrel{+}= 1\)
    • 查找答案:按字典序遍历 char i = 'a''z',若 \(mp[i] = 1\) 则输出 \(i\) 并结束
  4. 时间/空间复杂度

    • 时间复杂度:\(O(|S| + 26)\),统计频率 \(O(|S|)\),查找答案 \(O(26)\)
    • 空间复杂度:\(O(26)\),最多存储 \(26\) 个不同字符的频率
  5. 频率统计的核心思想

    • 多数与少数的区分:题目保证仅两种字符且一种仅出现一次,频率统计后直接筛选即可
    • 字典序保证唯一性:虽然题目保证唯一答案,但按字典序遍历 a-z 是一种稳健的查找策略
    • 适用于"找出序列中唯一/少数元素"类问题,核心是建立频率映射表

【算法标签】

入门 #字符串入门

【代码详解】

#include <bits/stdc++.h>
using namespace std;

string s;                    // 存储输入的字符串
map<char, int> mp;           // 字符到出现次数的映射

int main()
{
    // 输入字符串
    cin >> s;

    // 统计每个字符的出现次数
    for (int i = 0; i < s.size(); i++)
    {
        mp[s[i]]++;          // 对应字符的计数器加1
    }

    // 按字母顺序查找第一个只出现一次的字符
    for (char i = 'a'; i <= 'z'; i++)
    {
        if (mp[i] == 1)      // 找到第一个出现次数为1的字符
        {
            cout << i << endl;
            return 0;        // 直接结束程序
        }
    }

    // 如果没有找到符合条件的字符,返回0
    return 0;
}

【运行结果】

odd
o
posted @ 2026-08-27 11:02  团爸讲算法  阅读(7)  评论(0)    收藏  举报