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

题目描述

在一个字符串(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]
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 题目:在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置 ...
    qming_c阅读 223评论 0 0
  • 本文首发于我的个人博客:尾尾部落 题目描述 在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第...
    繁著阅读 933评论 0 3
  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 3,402评论 0 2
  • 一、Python简介和环境搭建以及pip的安装 4课时实验课主要内容 【Python简介】: Python 是一个...
    _小老虎_阅读 5,808评论 0 10
  • 我叫Jessie。 发表此篇文章的目的是想找一个/一群可以每天和我进行英语对话的友人,国内/国外的都可以,可加微信...
    Jessieyaa阅读 363评论 0 0