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-/
浙公网安备 33010602011771号