1 条题解

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

    📝 题目大意

    给定一个长度在 3 到 100 之间的小写英文字符串 SS,其中除一个字符外,其余所有字符都相同。要求找出这个唯一不同字符从 1 开始的位置编号。

    💡 解题思路

    1. 题目分析:字符串中只有两种字符,其中一种出现 1 次(目标字符),另一种出现 S1|S|-1 次。S100|S| \leq 100,数据量极小,直接统计即可。
    2. 算法推导
      • 使用 map<char, int>(或大小为 26 的数组)统计每个字符的出现次数 count
      • 遍历 count,找到 count[c] == 1 的字符,记为 target——它就是唯一不同的字符。
      • 再次遍历原字符串 SS,找到 S[i] == target 的位置,输出 i + 1(1-indexed)。
    3. 边界与细节
      • 输入保证合法,无需额外校验。
      • 输出的是 1-indexed 位置,不是 0-indexed。
      • map 或 26 大小的数组均可,复杂度没有区别。

    ⏱️ 复杂度分析

    • 时间复杂度O(N)O(N),其中 N=SN = |S|。最多遍历字符串两遍。
    • 空间复杂度O(1)O(1),字符集大小固定为 26。

    💻 标准代码 (C++)

    #include <iostream>
    #include <string>
    #include <map>
    using namespace std;
    
    int main() {
        string S;
        cin >> S;
    
        // 统计每个字符的出现次数
        map<char, int> count;
        for (char c : S) {
            count[c]++;
        }
    
        // 找到唯一出现 1 次的字符(即与其他所有字符都不同的那个)
        char target;
        for (auto& p : count) {
            if (p.second == 1) {
                target = p.first;
                break;
            }
        }
    
        // 遍历原字符串,找到 target 的位置(1-indexed)
        for (int i = 0; i < S.size(); i++) {
            if (S[i] == target) {
                cout << i + 1 << endl;
                return 0;
            }
        }
    
        return 0;
    }
    
    • 1

    信息

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