3.5练习
题目:去除重复字母
链接:https://leetcode.cn/problems/remove-duplicate-letters/description/
题目要求去除字符串中的重复字母,使得每个字母只出现一次,并且返回结果的字典序最小。为了解决这个问题,可以利用栈,结合贪心,统计字符最后出现的位置。
首先遍历字符串,记录每个字符最后一次出现的位置。
然后使用栈维护结果,遍历字符串时,通过一个栈来保存当前的最优结果。栈中的字符应尽可能保持字典序最小。
接下来处理每个字符,对于每个字符,如果它已经在栈中,跳过;否则,比较栈顶字符,若栈顶字符较大且后续还会出现,则弹出栈顶字符,以确保当前较小的字符能排在前面。
代码如下:
点击查看代码
string removeDuplicateLetters(string s) {
vector<int> l (256, -1); // 记录每个字符最后出现的位置
vector<bool> t (256, false); // 记录字符是否在栈中
stack<char> q; // 建立栈
for (int i = 0; i < s.size(); i++) {
l[s[i]] = i;
}
for (int i = 0; i < s.size(); i++) {
char c = s[i];
if (t[c]) continue; // 已存在栈中,跳过
while (!q.empty() && q.top() > c && l[q.top()] > i) { // 出栈的条件 :栈顶字符大于当前字符,栈顶字符在后面还会出现
t[q.top()] = false;
q.pop();
}
q.push(c);
t[c] = true;
}
string result;
while (!q.empty()) {
result += q.top();
q.pop();
}
reverse(result.begin(), result.end()); // 反转结果字符串
return result;
}

浙公网安备 33010602011771号