题目:
代码(首刷看解析 2024年3月31日):
class Solution {
public:
string removeDuplicateLetters(string s) {
vector<int> vis(26), num(26);
for (int i = 0; i < s.size(); ++i) {
num[s[i] - 'a'] = i;//记录字母最后一个数字的下标
}
string res = "";
res.push_back(s[0]);
vis[s[0] - 'a'] = 1;
// 遍历s,判断vis中是否存在ch,存在则跳过
for (auto i = 0; i < s.size(); i++) {
if (vis[s[i] - 'a'] == 1) continue;
// 不存在,判断res.back()和ch的大小,若ch大,加入;否则,查看num的back()下标是否>当前
else {
if (s[i] > res.back()) {
vis[s[i] - 'a'] = 1;
res.push_back(s[i]);
} else {
while (!res.empty() && s[i] < res.back() && num[res.back() - 'a'] > i) {
vis[res.back() - 'a'] = 0;
res.pop_back();
}
vis[s[i] - 'a'] = 1;
res.push_back(s[i]);
}
}
}
return res;
}
};