316. 去除重複字母

給定一個僅包含小寫字母的字符串,去除字符串中重複的字母,使得每個字母只出現一次。需保證返回結果的字典序最小(要求不能打亂其他字符的相對位置)。

示例 1:

輸入: “bcabc”
輸出: “abc”

示例 2:

輸入: “cbacdcbc”
輸出: “acdb”

分析:

這道題就是,第一去重複,第二就是選擇最小的字符串。
去重複倒是不難,主要是如何選擇最小的字符串?
首先,有幾點要明確:
1.只出現過一次的字符,肯定要存在。
2.當出現的字符有多個,是否應該保留?假設是這樣的情況,當前字符出現多次,我先添加上去,當後面出現一個字符小於它,則我可以刪了它而取後面的字符,如當前取的字符串爲bc(兩者都出現不止一次),後一個字符爲a,那麼就應該刪了b,再刪了c,之後再添加a,這樣就能保證是最小的情況。

代碼如下:

class Solution {
public:
    string removeDuplicateLetters(string s) {
        string res = "";
        for (int i = 0; i < s.length(); i++) {
            if (res.find(s[i]) == string::npos) {
                for (int j = res.length() - 1; j >= 0; j--) {
                    if (res[j] > s[i] && s.find(res[j], i + 1) != string::npos) {
                        res.erase(j);
                        continue;
                    }
                    break;
                }
                res += s[i];
            }
        }
        return res;
    }
};
發佈了41 篇原創文章 · 獲贊 2 · 訪問量 3365
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章