leetcode-华为专题-316. 去除重复字母

 

参考:

https://www.bilibili.com/video/BV1Tz4y167pC?from=search&seid=6576840001001728880

class Solution {
public:
    string removeDuplicateLetters(string s) {
        unordered_map<char, int> un_map;
        for(int i =0 ;i < s.size(); i++){
            un_map[s[i]] = i; // 保存最后一次出现的下标
        }
        stack<char> st;
        vector<bool> visited(s.size(),false); //visited数组,判断元素是否存在栈中
        for(int i = 0; i < s.size(); i++){
            //cout<<i<<" : "<<endl;
            if(visited[s[i]-'a'])  // 如果当前元素存在栈中,则跳过
                continue;
            // 如果栈不为 且栈顶元素大于当前元素且栈顶元素在当前元素后面仍出现,则栈顶元素出栈
            // 维护一个按照字典顺序递增栈
            while(!st.empty()&&un_map[st.top()]>i&&st.top()>s[i]){
                visited[st.top()-'a'] = false;  // 弹出,记录不在栈中
                //cout<<" st.top(): "<<st.top()<<endl;
                st.pop();
            }
            st.push(s[i]); // 当前元素入栈,记录栈中存在
            visited[s[i]-'a'] = true;
        }

        string res;
        while(!st.empty()){
            res.push_back(st.top());
            st.pop();
        }
        // 因为栈是反着来,需要翻转
        reverse(res.begin(),res.end());
        return res;
    }
};

 

posted @ 2021-08-17 19:40  三一一一317  阅读(66)  评论(0)    收藏  举报