'''
解题思路:
1、输出out为最小字典排列的字符串,如新字符已在out中,则直接跳过
2、如新字符si不在out中,但小于out[-1](不是字典序),检查后面是否还有out[-1],如有则删除当前out[-1];
   该过程通过while循环一直向前,直到while条件不满足
'''

class Solution:
    def removeDuplicateLetters(self, s):

        s = list(s)
        print('s=',s)
        n = len(s)

        out = [s[0]]
        for i in range(1,n):
            si = s[i]
            # 1、输出out为最小字典排列的字符串,如新字符已在out中,则直接跳过
            if si in out:
                continue
            # 2、如新字符si不在out中,但小于out[-1](不是字典序),检查后面是否还有out[-1],如有则删除当前out[-1];
            # 该过程通过while循环一直向前,直到while条件不满足
            while out and si<out[-1] and out[-1] in s[i+1:]:
                out.pop()
            out.append(si)
            print('i=',i,'out=',out)

        return ''.join(out)

# s = 'cbacdcbc'  # acdb
s = "bcabc"  # abc
s = "abacb" # abc
t = Solution().removeDuplicateLetters(s)
print(t)