題目描述
在一個(gè)字符串(0<=字符串長(zhǎng)度<=10000盈滴,全部由字母組成)中找到第一個(gè)只出現(xiàn)一次的字符,并返回它的位置, 如果沒有則返回 -1(需要區(qū)分大小寫).
分析
因?yàn)橐獏^(qū)分大小寫喂很,總共會(huì)有52個(gè)字母斜友,相對(duì)于字符串長(zhǎng)度可以忽略,因?yàn)榫S護(hù)一個(gè)長(zhǎng)度為52的字典貌似是可行的方法届良,此字典中key是52個(gè)字母,value是該字母出現(xiàn)的index,初始設(shè)為-1覆享。依次遍歷字符串,若該字母不在dict中則說明是第一次出現(xiàn)营袜,將索引index記錄為它的value撒顿,若字母已經(jīng)在dict中,則將該字母的value+n(n為字符串長(zhǎng)度)连茧。遍歷完成后核蘸,在dict中,若value=-1說明該字母從來沒出現(xiàn)過啸驯,若value>=n則說明該字母已經(jīng)出現(xiàn)過客扎,這兩類字母不可能是結(jié)果,在剩下的字母中找出value最小的那個(gè)罚斗,就是結(jié)果徙鱼。
已經(jīng)出現(xiàn)的字母 value+= n :
這樣既能標(biāo)記處它不符合要求,又可以反映出它和從來沒出現(xiàn)過的字母的區(qū)別。
相當(dāng)于一個(gè)節(jié)點(diǎn)儲(chǔ)存了兩種信息袱吆。
# -*- 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:# 第一次出現(xiàn)厌衙,記錄它的位置
res[c] = i
else: # 不是第一次出現(xiàn),位置加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]