給定一個只包含小寫字母的字串,刪除重複的字母,每個字母只出現一次。在所有結果中,輸出字典順序最小的。
阿新 • • 發佈:2019-01-29
本題源自leetcode 316
---------------------------------------------------------------------------------
思路:1 用倆個vector 標記字元在串中的出現的次數,以及這個字元是否訪問過。
2 先遍歷一遍字串,統計字元出現的次數
3 第二遍遍歷字元,每次訪問一個字元都將字元出現的次數減一,如果字元被訪問過,直接跳過。否則與結果字串尾端比較。如果要插入的字元比尾端字元小,而且尾端字元在後面的字串中還有。就彈出尾端字元,設標記未訪問。否則就插入字元。
程式碼:
string removeDuplicateLetters(string s) { vector<int> vec(256,0); vector<bool> visited(256,0); for(char c : s) vec[c]++; string res = ""; for(char c : s){ vec[c]--; //每次遍歷一個字元就將他出現的次數減一 if(visited[c]) //標記是否訪問過 continue; //如果結果字串尾端的字元比將要插入字元大,而且後面字串中還有這個字元,就彈出。 while(vec[res.back()] && c < res.back()){ visited[res.back()] = false; res.pop_back(); } res += c; visited[c] = true; } return res; }