算法javascript版
316.去除重复字母
因为while循环只是对字母的出栈和入栈操作,所以时间复杂度是O(n)。
使用了两个数组,所以空间开销是O(2|E|),E是26个字母。
官方最优解法,空间开销小,值得学习。点击这里
var s='cbacdcbc';
var removeDuplicateLetters = function(s) {
// 标记次数
const arr = new Array(26).fill(0);
// 标记是否访问过
const visited = new Array(26).fill(false);
let temp;
for(let item of s){
temp = item.charCodeAt()-97;
arr[temp] = arr[temp]+1;
}
let stack = [];
for(let key of s){
temp = key.charCodeAt()-97;
// 没有访问过
if(!visited[temp]){
// 对比栈顶元素
while(stack.length>0&&stack[stack.length-1]>key){
let t = stack[stack.length-1].charCodeAt()-97;
// 元素在后面还出现过
if(arr[t]>0){
// 标记栈顶元素未访问过
visited[t]=false;
// 将栈顶元素弹出
stack.pop();
}else{
// 栈顶元素在后面没有出现过,跳过不做处理
break;
}
}
// 标记当前遍历元素被访问过
visited[temp]=true;
// 将当前元素压入栈中
stack.push(key);
}
// 将当前元素在后续的出现次数中减1
arr[temp]-=1;
}
// return stack.join("");
console.log(stack.join(""));
};
removeDuplicateLetters(s);