2351. 第一次出現兩次的字母

胖柚の工作室發表於2024-04-23

題目連結:

自己的做法:

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
    }
};

相關文章