leetcode1081

找到一个跟我的思路比较接近的参考解决方案:

 1 class Solution:
 2     def smallestSubsequence(self, text: str) -> str:
 3         n = len(text)
 4         d = collections.defaultdict(collections.deque)
 5         # record index
 6         for i,v in enumerate(text):
 7             d[ord(v)-ord('a')].append(i)
 8         
 9         # search orderly
10         keys = sorted(d.keys())
11         res = []
12         c = len(d)
13         last_index = -1
14         while len(res) < c: # len(res) will not larger than 26
15             # O(26*26) time, search the first smallest letter
16             for i in range(len(keys)):
17                 if all(d[keys[i]][0] < d[keys[j]][-1] for j in range(i+1, len(keys))):
18                     res.append(chr(ord('a')+keys[i]))
19                     last_index = d[keys[i]][0]
20                     keys.remove(keys[i])
21                     break
22             # O(n) time, delete all index less than last_index
23             for i in range(len(keys)):
24                 while d[keys[i]] and d[keys[i]][0] < last_index:
25                     d[keys[i]].popleft()
26   
27         return ''.join(res)

参考:https://leetcode.com/problems/smallest-subsequence-of-distinct-characters/discuss/308222/show-my-thinking-process

转载于:https://www.cnblogs.com/asenyang/p/10995035.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值