#include <iostream> #include <vector> using namespace std; int main() { string s; cin >> s; vector<int> order; // 记录出现顺序 vector<int> counts(26, 0); // 记录出现次数,哈希表 for (char& c: s) { counts[c - 'a']++; // 计数 // 判断是否为新出现的字母,是则将其下标存入 order if (counts[c - 'a'] == 1) { order.push_back(c - 'a'); } } // 按order保存的下标顺序遍历counts for (auto& i: order) { // 如果第一次找到counts[i]是1,说明这个下标对应的字母就是结果 if (counts[i] == 1) { cout << (char)(i + 'a') << endl; return 0; } } // 没有计数为 1 的字母 cout << -1 << endl; return 0; }
使用知识点:指针,ASCII码值,哈希表。
时间复杂度:O(n)。两次遍历,第二次遍历为常数级遍历。
空间复杂度:O(n)。一个string,两个额外数组,其中一个是固定26 int 大小的哈希表,另一个是记录哈希表下标的指针数组,大小小于等于26 int。