给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证 返回结果的字典序最小(要求不能打乱其他字符的相对位置)。
示例 1:
输入:s = "bcabc"
输出:"abc"示例 2:
输入:s = "cbacdcbc"
输出:"acdb"关键在于返回结果的字典序最小,所以字母小的在前面保证满足条件
思路:
创建一个哈希表,存储每个字母在字符串最后出现的位置
创建一个stack栈,以及一个set集合,set集合用来判断字母是不是已经存在(一开始想着indexOf,效率极低,改为set速度很快)
遍历字符串,如果字符串已存在直接跳过,如果栈中有元素并且栈顶的字母大于当前字母,同时在后面的位置还能找到栈顶的字母,弹出栈顶字母
将字符推入stack以及set中
var removeDuplicateLetters = function(s) {
let map = new Map();
for (let i = 0; i < s.length; i++) {
map.set(s[i], i);
}
let stack = [];
let inStack = new Set();
for (let i = 0; i < s.length; i++) {
if (inStack.has(s[i])) {
continue;
}
while (stack.length > 0 && stack[stack.length - 1] > s[i] && map.get(stack[stack.length - 1]) > i) {
inStack.delete(stack.pop());
}
stack.push(s[i]);
inStack.add(s[i])
}
return stack.join('')
};