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;
}
posted @ 2025-03-05 22:06  扶风zer0  阅读(27)  评论(0)    收藏  举报