Leetcode 316去除重复字母

Leetcode 316去除重复字母

  • 题目简述:给你一个仅包含小写字母的字符串,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证返回结果的字典序最小(要求不能打乱其他字符的相对位置)。

  • 输入:“bcabc” 输出: “abc”

    输入:“cbacdcbc” 输出: “acdb”

  • 思路:从前往后遍历整个字符串,并用一个栈维护当前答案:

    • 如果当前字符已经在答案中,直接跳过
    • 如果没有,就将该字符加入答案中。但是为了保证字典序最小,需要考虑是否弹出栈顶元素,弹出的条件是:当前元素小于栈顶元素,并且当前栈顶元素还在后面出现过
    • 使用一个哈希表记录每个字符最后一次出现的位置,再用一个标记数组判断当前字符是否在答案中出现过
class Solution {
public:
    string removeDuplicateLetters(string s) {
        string res;
        unordered_map<char, int> hash;
        vector<bool> vec(26,false);
        for(int i = 0; i < s.size(); i++) hash[s[i]] = i;
        for(int i = 0; i < s.size(); i++)
        {
            if(vec[s[i] - 'a']) continue;
            //i < hash[res.back()]表示栈顶元素还会在当前元素后面出现
            while(res.size() > 0 && s[i] < res.back() && i < hash[res.back()])
            {
                vec[res.back() - 'a'] = false;
                res.pop_back();
            }
            res += s[i];
            vec[s[i] - 'a'] = true;
        }
        return res;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值