1081. 不同字符的最小子序列
原始题目链接:https://leetcode.cn/problems/smallest-subsequence-of-distinct-characters/
返回 s 字典序最小的子序列,该子序列包含 s 的所有不同字符,且只包含一次。
注意:该题与 316 https://leetcode.com/problems/remove-duplicate-letters/ 相同
示例 1:
输入:s = “bcabc”
输出:“abc”
示例 2:
输入:s = “cbacdcbc”
输出:“acdb”
解题思路:
单调栈,存储字典序列最小的字符。
代码实现:
class Solution:
def smallestSubsequence(self, s: str) -> str:
# 存储结果字符
ans = []
# 统计字符个数的哈希表,验证字符的个数
counter = collections.Counter(s)
for c in s:
if c not in ans:
# 栈中有元素,并且当前字符比栈顶的元素小,并且栈顶的元素在后面的字符串中也能找到
# 因为题目要求是最小的子序列,那么将栈顶元素弹出栈,当前元素入栈
while ans and ans[-1] > c and counter[ans[-1]] > 0:
ans.pop()
ans.append(c)
# 字符入栈,当前字符个数减1
counter[c] -= 1
return ''.join(ans)