Leetcode刷题笔记20-字符串中的第一个唯一字符

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
扫描二维码关注公众号,回复: 1568677 查看本文章

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, 则删除。

猜你喜欢

转载自www.cnblogs.com/Joyce-song94/p/9172179.html