1081 Smallest Subsequence of Distinct Characters
思路也是很奇妙的一道题,我们首先处理出来每个字符的index list, 在这个list中,我们每次按照字母的顺序,选取存在的第一个,出现的index小于其他后面后面任何的最后出现index.
例子如下:
s = 'cdadabcc',
s
containsa, b, c, d
index['a'] = [2, 4]
index['b'] = [5]
index['c'] = [0, 6, 7]
index['d'] = [1, 3Which will be the first letter in ans?
It will be letter 'a', cause2 < min(5, 7, 3)
, (5,7,3) is thelast index
of other letters, after append 'a', now the index becomes
index['b'] = [5]
index['c'] = [6, 7]
index['d'] = [3]We delete all index less than 2. Obviously, the next letter will be 'd', analyse one by one.
class Solution(object):
def smallestSubsequence(self, text):
"""
:type text: str
:rtype: str
"""
n = len(text)
d = collections.defaultdict(collections.deque)
for i, v in enumerate(text):
d[ord(v) - ord('a')].append(i)
keys = sorted(d.keys())
res = []
c = len(d)
last_index = -1
while len(res) < c:
for i in range(len(keys)):
if all(d[keys[i]][0] < d[keys[j]][-1] for j in range(i+1, len(keys))):
res.append(chr(ord('a') + keys[i]))
last_index = d[keys[i]][0]
keys.remove(keys[i])
break
for i in range(len(keys)):
while d[keys[i]] and d[keys[i]][0] < last_index:
d[keys[i]].popleft()
return ''.join(res)