[Oracle] LeetCode 316 Remove Duplicate Letters 单调栈
Given a string s, remove duplicate letters so that every letter appears once and only once. You must make sure your result is the smallest in lexicographical order among all possible results.
Solution
删除重复出现的元素,且使得最终的结果字典序最小。
如果一个字母在 \(s[i]\) 的前后都出现了,且比 \(s[i]\) 大, 那么显然我们取后者,删除前面的。我们可以用 \(map\) 来维护这个字母是否出现,用 \(last\_idx\) 来维护这个字母最后出现的位置。
用一个 \(stack\) 来维护答案,如果栈首元素比当前元素大,且后面也出现了,那么显然应该 \(pop\) 出去
点击查看代码
class Solution {
private:
string ans ="";
stack<char> sk;
map<int, bool> vis;
public:
string removeDuplicateLetters(string s) {
int n = s.size();vector<int> last_idx(26,0);
for(int i=0;i<n;i++){
// last position
last_idx[s[i]-'a']=i;
}
for(int i=0;i<n;i++){
int cur = s[i]-'a';
if(vis[cur])continue;
while(!sk.empty() && s[i]<sk.top() && i<last_idx[sk.top()-'a']){
vis[sk.top()-'a']=false; sk.pop();
}
sk.push(s[i]); vis[cur]=true;
}
while(!sk.empty()){
ans+=sk.top();sk.pop();
}
reverse(ans.begin(), ans.end());
return ans;
}
};