1. 程式人生 > 實用技巧 >LeetCode 316. 去除重複字母 棧 雜湊

LeetCode 316. 去除重複字母 棧 雜湊

地址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 <= 104
s 由小寫英文字母組成

演算法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; } };