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