1. 题目
给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。
注意事项:您可以假定该字符串只包含小写字母。
2. 示例
s = "leetcode" 返回 0. s = "loveleetcode", 返回 2.
3. 解答
python3 超时
class Solution: def firstUniqChar(self, s): s_list = list(s) for idx in range(len(s_list)): s_list_cur = copy.deepcopy(s_list) s_list_cur.remove(s_list[idx]) s_dict = dict(zip(s_list_cur, range(len(s_list_cur)))) if s_dict.get(s_list[idx]) is None: return idx return -1
超时而且有错误。
如果多个键值为同一个字母,用dict.get函数得到的总是最大的键,即,最后那个字母的下标。所以对于有多个重复字母的情况下,最后那个字母就无法通过dict.get函数去判别它之前是否有相同的字母。那么下面代码中用等号进行判别的方法就失效了。
例如:输入字符串“cc”时,返回的是1。而正确答案是-1。
class Solution: def firstUniqChar(self, s): s_list = list(s) s_dict = dict(zip(s_list, range(len(s_list)))) for idx in range(len(s_list)): if s_dict.get(s_list[idx]) == idx: return idx return -1
4. 优答
python3 200ms
from collections import defaultdict class Solution(object): def firstUniqChar(self, s): """ :type s: str :rtype: int """ lookup = defaultdict(int) candidtates = set() for i, c in enumerate(s): if lookup[c]: candidtates.discard(lookup[c]) else: lookup[c] = i+1 candidtates.add(i+1) #必须是i+1,因为字典加进去的时候就是i+1 return min(candidtates)-1 if candidtates else -1 solution = Solution() s = "loveleetcode" # s = "cgcg" first = solution.firstUniqChar(s) print(first)
集合的操作解析
set.discard(x) :如果在 set 中存在元素 x, 则删除。