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