要求:去除字符串中重复的字母,使得每个字母只出现一次。需要保证 “返回结果的字典序最小(要求不能打乱其他字符的相对位置)”。

针对题目的三个要求:去重、不能打乱其他字符顺序、字典序最小。我们来一一分析。

去重:可以通过 “使用哈希表存储字母出现次数” 的方式,将每个字母出现的次数统计起来,再遍历一遍,去除重复的字母。

不能打乱其他字符顺序:按顺序遍历,将非重复的字母存储到答案数组或者栈中,最后再拼接起来,就能保证不打乱其他字符顺序。

字典序最小:意味着字典序小的字母应该尽可能放在前面。

要满足第 3 条需求,我们可以使用 “单调栈” 来解决。我们使用单调栈存储 s[i] 之前出现的非重复、并且字典序最小的字符序列。整个算法步骤如下:

先遍历一遍字符串,用哈希表 letter_counts 统计出每个字母出现的次数。

然后使用单调递减栈保存当前字符之前出现的非重复、并且字典序最小的字符序列。

最后将单调栈中的字符依次拼接为答案字符串,并返回。