316. 去除重复字母
难度:中等🌟🌟🌟
给你一个字符串 s
,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证 返回结果的字典序最小(要求不能打乱其他字符的相对位置)。
**注意:**该题与 1081 https://leetcode-cn.com/problems/smallest-subsequence-of-distinct-characters 相同
示例 1:
输入:s = "bcabc"
输出:"abc"
示例 2:
输入:s = "cbacdcbc"
输出:"acdb"
提示:
1 <= s.length <= 104
s
由小写英文字母组成
题解:
贪心 + 栈 + 哈希表
比如 字符串 s='bac'
,删除一个字符如何使得得到字典序最小?
解决方法是:遍历字符串 s
,当满足 s[i]>s[i+1]
的时候,删除 i
即可得到最小 ,我们将这个字符串记住作 关键字符
第一种最直接的想法是:遍历字符串,找到 关键字符 ,然后去除它 ,但是效率不高
有没有更优化的解法呢?
尝试一下做法,以 s = "bcabc"
为例:
遇到 b
,入栈 ,遇到 c
,入栈(满足字典序列就可以直接入栈);
遇到 a
,此时栈顶部元素为 c
,现在我们站在上帝视角可以看见字符串后面还有 c
,因此可以将栈顶元素 c
弹出 ; 此时栈顶元素为 b
,字符串后面依然还有 b
,也将其弹出;此时栈已经空了,将 a
入栈;
遇到 b
满足字典序,入栈;
遇到 c
满足字典序,入栈;
最终的结果为 abc
c++
class Solution {
public:
string removeDuplicateLetters(string s) {
string st;
vector<int> vis(26),mp</