1 条题解
-
0
📝 题目大意
给定一个长度在 3 到 100 之间的小写英文字符串 ,其中除一个字符外,其余所有字符都相同。要求找出这个唯一不同字符从 1 开始的位置编号。
💡 解题思路
- 题目分析:字符串中只有两种字符,其中一种出现 1 次(目标字符),另一种出现 次。,数据量极小,直接统计即可。
- 算法推导:
- 使用
map<char, int>(或大小为 26 的数组)统计每个字符的出现次数count。 - 遍历
count,找到count[c] == 1的字符,记为target——它就是唯一不同的字符。 - 再次遍历原字符串 ,找到
S[i] == target的位置,输出i + 1(1-indexed)。
- 使用
- 边界与细节:
- 输入保证合法,无需额外校验。
- 输出的是 1-indexed 位置,不是 0-indexed。
- 用
map或 26 大小的数组均可,复杂度没有区别。
⏱️ 复杂度分析
- 时间复杂度:,其中 。最多遍历字符串两遍。
- 空间复杂度:,字符集大小固定为 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
- 上传者