题目链接
英文链接:https://leetcode.com/problems/smallest-subsequence-of-distinct-characters/
中文链接:https://leetcode-cn.com/problems/smallest-subsequence-of-distinct-characters/
题目详述
返回字符串 text 中按字典序排列最小的子序列,该子序列包含 text 中所有不同字符一次。
示例 1:
1 | 输入:"cdadabcc" |
示例 2:
1 | 输入:"abcd" |
示例 3:
1 | 输入:"ecbacba" |
示例 4:
1 | 输入:"leetcode" |
提示:
- 1 <= text.length <= 1000
- text 由小写英文字母组成
题目详解
- 首先统计各个字符出现的次数。
- 维护一个单调栈,从栈底到栈顶单调递增。
- 遍历字符串,对于每一个字符,首先让它的出现次数递减。如果这个字符在之前出现过,直接跳过;否则如果它比栈顶字符小,并且后面还存在这个字符,弹出栈顶并设置出现标志为 false,最后把当前字符入栈并设置出现标志。
- 最终栈中剩余的字符组合的字符串就是结果。
1 | public class LeetCode_01081 { |
- 因为只需判断后面是否存在该字符,所以可以不用统计字符出现次数,转而计算每个字符最后出现的位置,这样判断是否为最后一个字符就很简单了。
- 因为只需要 26 个标志位,可以使用位运算压缩,不过看上去不那么直观。
1 | public class LeetCode_01081 { |