題目連結:
自己的做法:
class Solution {
public:
char repeatedCharacter(string s) {
int n = s.size();
vector<int> v(28);
vector<pair<char,int> > p;
for (int i = 0; i < s.size(); i++) {
int j = s[i] - 'a';
v[j]++;
if (v[j] == 2) p.push_back({s[i], i});
}
sort(p.begin(), p.end(), [&](pair<char,int> &a, pair<char,int> &b) {return a.second < b.second;});
return p[0].first;
}
};
更優解:
用二進位制數 \(\rm letter26\) 表示出現過的所有字母的集合, \(\rm letter26\) 的從低到高第 \(x\) 位是 \(1\) 表示第 \(x\) 個字母出現過,\(0\) 則表示第 \(x\) 個字母未出現過。
從左到右遍歷字串,對於遍歷到的每個字元 \(i\),得到字元 \(i\) 對應的字母編號 \(j\),計算 \(\rm bits=2^j\),執行如下操作:
- 若 \(\rm bits\) & \(\rm letter26\) == \(0\),則當前字元是第一次出現,將 \(\rm letter26\) 的值更新為 \(\rm letter26 | bits\)
- 否則的話當前字元是第二次出現,將當前字元作為答案返回
class Solution {
public:
char repeatedCharacter(string s) {
int letter26 = 0;
for (auto i : s) {
int j = i - 'a';
int bits = 1 << j;
if ((bits & letter26) == 0) {
letter26 = letter26 | bits;
}
else return i;
}
return 'a';//unreachable
}
};