算法作業13

題目地址https://leetcode.com/problems/remove-duplicate-letters/#/description

題目描述:Given a string which contains only lowercase letters, remove duplicate letters so that every letter appear once and only once. You must make sure your result is the smallest in lexicographical order among all possible results.

我的代碼

class Solution {
public:
    string removeDuplicateLetters(string s) {
        int a[26]={0};
        int hv[26]={0};
        for(char c : s){
            a[c-'a']++;
        }
        string str="";
        for(char c:s){
            a[c-'a']--;
            if(hv[c-'a']) continue;
            while(str.size()>0&&str[str.size()-1]>c&&a[str[str.size()-1]-'a']>0) {
                hv[str[str.size()-1]-'a']=0;
                str.pop_back();
            }
                str+=c;
                hv[c-'a']=1;

        }
        return str;
    }
};

解題思路
先看一些簡單的事實,對於兩個連續的字符,如果前面的字符比後面的大,而且在這兩個字符後面的子串中還有與前面的字符相同,那麼前面的字符一定會被刪除,刪除後最終的結果不變,原因是相較於留下前面的字符,留下後面的相同字符其結果更小。
而現在就根據這一事實來求解這個題目。第一步要確定在在第k個字符後還有哪些字符,顯然需要從k=0開始統計,遍歷s記錄即可。而對於之後的k+1,只需在k的基礎上減去自己。
然後,有了這一統計結果,先構造空串str,在遍歷s逐步修改str。對於第k步(k從0開始,對應於s的第k個字符),基於前面的事實,當該字母已經在str中存在時,易知無需理會。而當不存在時,先根據前面的事實刪除掉str的末尾的字符直到不符合該事實的條件,然後將該字符加在str的末尾即可。
由於只遍歷s,複雜度爲O(n).

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章