去除重复字母

要将一个字符串去掉重复字符并使最后字典序最小,

首先开两个map一个记录最小出现的位置,第二个记录当前是否被压入单调栈中,当她不再的时候,如果她比当前栈顶元素小,并且栈顶元素还会出现,则把当前元素压进去,将栈顶弹出,不然则直接跳过判断下一个
点击查看代码
class Solution
{
public:
    string removeDuplicateLetters(string s)
    {
        // 第一个map,用于记录每个字符最后出现的位置
        map<char, int> mp;
        // 第二个map,用于记录每个字符是否已经被加入到zhan中
        map<char, int> vis;
        // 记录每个字符最后出现的位置
        for (int i = 0; i < s.size(); i++)
            mp[s[i]] = i;

        // 模拟栈,
        vector<char> st;

        // 再次遍历字符串s
        for (int i = 0; i < s.size(); ++i)
        {
            // 如果当前字符已经在栈中,则跳过
            if (vis[s[i]])
            {
                continue;
            }
            while (st.size() && s[i] < st.back() && mp[st.back()] > i) //   // 当栈不为空,且栈顶元素大于当前字符,且栈顶元素在后面还会出现时,需要弹出栈顶元素,以保证结果字符串的字母按字母表顺序排列
            {
                // 更新vis中对应字符的状态
                vis[st.back()]--;
                st.pop_back();
            }

            // 将当前字符压入栈中,并标记为已出现
            st.push_back(s[i]);
            vis[s[i]]++;
        }

        string res;//便利更改为字符串
        for (int i = 0; i < st.size(); i++)
        {
            res += st[i];
        }
        return res;
    }
};
posted @ 2024-07-23 17:19  台州第一深情  阅读(6)  评论(0编辑  收藏  举报