算法列表

316.去除重复字母 中等

布莱克2026-03-20 16:48

问题:

给你一个字符串 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('')
};


assistant