leetcode 316. 去除重复字母 ——去重

#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
#include <string>
using namespace std;

class Solution {
public:
    string removeDuplicateLetters(string s) {
                                                //因为输入为 ASCII 字符,数组大小为256
        bool if_in_queue[256] = {};                //初始化记录每个字母是否在栈中
        int count_char[256] = {};
        int s_size = s.size();
        for (int i = 0; i < s_size; i++) {        //初始化记录每个字母出现的次数
            count_char[s[i]]++;
        }

        vector<char> v;                            //临时的栈

        for (int s_index = 0; s_index < s_size; s_index++) {
            count_char[s[s_index]] --;            // 每遍历过一个字符,都将对应的计数减一
            if (if_in_queue[s[s_index]])        //字母在栈中 为true -》忽略对这个字母的操作,不入栈
                continue;
                                                
                                                // 插入之前,和之前的元素比较一下大小
                                                //如果当前字符比之前的字符小-》且当前的栈非空,继续操作,否则将字符压栈①
            while (!v.empty() && s[s_index] < v.back()) {
                if (count_char[v.back()] == 0) {
                    break;
                }
                                                // 如果字典序比前面的小,pop 前面的元素
                if_in_queue[v.back()] = false;
                v.pop_back();
            }
            v.push_back(s[s_index]);            //①将字符压栈
            if_in_queue[s[s_index]] = true;        //记得压栈后置in_queue为true
        }

        string out;                                //输出
        for (int i = 0; !v.empty(); i++) {
            out = v.back() + out;
            v.pop_back();
        }
        return out;
    }
};


int main()
{
    Solution s;
    string str = "cbacdcbc";
    str = s.removeDuplicateLetters(str);
    cout << str;
    cout << endl;
}

参考:https://leetcode-cn.com/problems/remove-duplicate-letters/solution/you-qian-ru-shen-dan-diao-zhan-si-lu-qu-chu-zhong-/

posted on 2021-01-27 16:52  平ping  阅读(77)  评论(0)    收藏  举报