LeetCode 316. 去除重複字母 棧 雜湊
阿新 • • 發佈:2020-12-20
地址https://leetcode-cn.com/problems/remove-duplicate-letters/
給你一個字串 s ,請你去除字串中重複的字母,使得每個字母只出現一次。 需保證 返回結果的字典序最小(要求不能打亂其他字元的相對位置)。 注意:該題與 1081 https://leetcode-cn.com/problems/smallest-subsequence-of-distinct-characters 相同 示例 1: 輸入:s = "bcabc" 輸出:"abc" 示例 2: 輸入:s = "cbacdcbc" 輸出:"acdb" 提示: 1 <= s.length <= 104s 由小寫英文字母組成
演算法1
單調棧和雜湊
記錄字母出現的次數 和字母是否已經存在棧中適應雜湊
使用單調棧 排序可能的 字母序比較小的選擇
C++ 程式碼
class Solution { public: int mm[26]; stack<char> st; int isInSt[26]; string removeDuplicateLetters(string s) { for (int i = 0; i < s.size(); i++) { mm[s[i]-'a']++; }for (int i = 0; i < s.size(); i++) { if(isInSt[s[i]-'a'] ==0){ while (!st.empty()&& isInSt[s[i]-'a'] == 0) { char top = st.top(); if (mm[top-'a'] > 1 && s[i]< top ) { st.pop(); mm[top-'a']--; isInSt[top-'a']--; } else { break; } } //無論如何 此刻總要push進去的 st.push(s[i]); isInSt[s[i]-'a']++; } else { mm[s[i]-'a']--; } } string ans = ""; while (!st.empty()) { ans.insert(ans.begin(), st.top()); st.pop(); } return ans; } };