監控多資料夾目錄變化,python,win32
方法一:使用雜湊表儲存頻數
我們可以對字串進行兩次遍歷。
在第一次遍歷時,我們使用雜湊對映統計出字串中每個字元出現的次數。在第二次遍歷時,我們只要遍歷到了一個只出現一次的字元,那麼就返回該字元,否則在遍歷結束後返回空格。
class Solution { public: char firstUniqChar(string s) { unordered_map<char, int> mp; for (char c : s) mp[c]++; char res = ' '; for (char c : s) { if (mp[c] == 1) { res = c; break; } } return res; } };
方法二:使用雜湊表儲存索引
我們可以對方法一進行修改,使得第二次遍歷的物件從字串變為雜湊對映。
具體地,對於雜湊對映中的每一個鍵值對,鍵表示一個字元,值表示它的首次出現的索引(如果該字元只出現一次)或者 −1(如果該字元出現多次)。當我們第一次遍歷字串時,設當前遍歷到的字元為 c,如果 c 不在雜湊對映中,我們就將 c 與它的索引作為一個鍵值對加入雜湊對映中,否則我們將 c 在雜湊對映中對應的值修改為 −1。
在第一次遍歷結束後,我們只需要再遍歷一次雜湊對映中的所有值,找出其中不為 −1 的最小值,即為第一個不重複字元的索引,然後返回該索引對應的字元。如果雜湊對映中的所有值均為 −1,我們就返回空格。
class Solution { public: char firstUniqChar(string s) { int n = s.size(); unordered_map<char, int> mp; for (int i = 0; i < n; i++) if (mp.count(s[i])) mp[s[i]] = -1; else mp[s[i]] = i; int minIndex = n; for (auto [c, index] : mp) if (index != -1 && index < minIndex) minIndex = index; return minIndex == n ? ' ' : s[minIndex]; } };
方法三:佇列
我們也可以藉助佇列找到第一個不重複的字元。佇列具有「先進先出」的性質,因此很適合用來找出第一個滿足某個條件的元素。
具體地,我們使用與方法二相同的雜湊對映,並且使用一個額外的佇列,按照順序儲存每一個字元以及它們第一次出現的位置。當我們對字串進行遍歷時,設當前遍歷到的字元為 c,如果 c 不在雜湊對映中,我們就將 c 與它的索引作為一個二元組放入隊尾,否則我們就需要檢查佇列中的元素是否都滿足「只出現一次」的要求,即我們不斷地根據雜湊對映中儲存的值(是否為 −1)選擇彈出隊首的元素,直到隊首元素「真的」只出現了一次或者佇列為空。
在遍歷完成後,如果佇列為空,說明沒有不重複的字元,返回空格,否則隊首的元素即為第一個不重複的字元以及其索引的二元組。
在維護佇列時,我們使用了「延遲刪除」這一技巧。也就是說,即使佇列中有一些字元出現了超過一次,但它只要不位於隊首,那麼就不會對答案造成影響,我們也就可以不用去刪除它。只有當它前面的所有字元被移出佇列,它成為隊首時,我們才需要將它移除。
class Solution {
public:
char firstUniqChar(string s) {
int n = s.size();
unordered_map<char, int> mp;
queue<char> q;
for (int i = 0; i < n; i++) {
if (mp.count(s[i])) {
mp[s[i]] = -1;
while (q.size() && mp[q.front()] == -1)
q.pop();
} else {
mp[s[i]] = i;
q.push(s[i]);
}
}
return q.size() ? q.front() : ' ';
}
};