美文网首页
剑指Offer--第一个只出现一次的字符

剑指Offer--第一个只出现一次的字符

作者: lazydecoder | 来源:发表于2019-04-17 17:59 被阅读0次

    题目描述

    在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).

    分析

    因为要区分大小写,总共会有52个字母,相对于字符串长度可以忽略,因为维护一个长度为52的字典貌似是可行的方法,此字典中key是52个字母,value是该字母出现的index,初始设为-1。依次遍历字符串,若该字母不在dict中则说明是第一次出现,将索引index记录为它的value,若字母已经在dict中,则将该字母的value+n(n为字符串长度)。遍历完成后,在dict中,若value=-1说明该字母从来没出现过,若value>=n则说明该字母已经出现过,这两类字母不可能是结果,在剩下的字母中找出value最小的那个,就是结果。

    已经出现的字母 value+= n :

    这样既能标记处它不符合要求,又可以反映出它和从来没出现过的字母的区别。
    相当于一个节点储存了两种信息。

    # -*- coding:utf-8 -*-
    import string
    class Solution:
        def FirstNotRepeatingChar(self, s):
            # write code here
            if len(s) == 0:
                return -1
            res = {}
            for word in string.lowercase+string.uppercase:
                res[word] = -1
            for i in range(len(s)):
                c = s[i]
                if res.get(c) == -1:# 第一次出现,记录它的位置
                    res[c] = i
                else: # 不是第一次出现,位置加n
                    res[c]+=len(s)
            res = filter(lambda item: True if item[1]<len(s)and item[1] >=0 else False ,res.items())
            return sorted(res,key=lambda d:d[1])[0][1]
    

    相关文章

      网友评论

          本文标题:剑指Offer--第一个只出现一次的字符

          本文链接:https://www.haomeiwen.com/subject/xpglwqtx.html