1. 程式人生 > >給定一個只包含小寫字母的字串,刪除重複的字母,每個字母只出現一次。在所有結果中,輸出字典順序最小的。

給定一個只包含小寫字母的字串,刪除重複的字母,每個字母只出現一次。在所有結果中,輸出字典順序最小的。

本題源自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;
    }