Description
在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置
Code
之所以记录这道题,倒不是因为这道题难,而是为了记录下这道题在python下的解法。
这道题的常规解法就是遍历字符串,然后存在数组中,统计次数。最后遍历数组,得出第一个只出现了一次的字符。
然而由于python中的dict会自动排序(python2),所以会导致dcba时,输出的是a而不是d。这时,有两种解决办法:
def FirstNotRepeatingChar(self, s):
# write code here
keyMap, pos = {}, {}
for idx, i in enumerate(s):
if i in pos:
keyMap[pos[i]] = 0
else:
keyMap[idx] = 1
pos[i] = idx
for i in keyMap:
if keyMap[i] == 1:
return i
return -1
keyMap存的key value形式为index => count,pos存的key value为char => first index。因为从左到右遍历,index逐渐增大,所以keyMap不用担心被排序,而为了找到某个字符的index,需要从pos字典中获取。比如dcba,keyMap = {0:1, 1:1, 2:1, 3:1},pos = {a:3, b:2, c:1, d:0}。这样keyMap中保留的字符出现的顺序和次数,而不用担心排序会打乱出现的顺序,因为本身就是有序的。
其实keyMap似乎不用dict,用数组也可以...
另一种方法:
def FirstNotRepeatingChar(self, s):
# write code here
keyMap = {}
for idx, i in enumerate(s):
if i in keyMap:
keyMap[i] = -1
else:
keyMap[i] = idx
for i in s:
if keyMap[i] != -1:
return keyMap[i]
return -1
不用idx记录顺序了,由于s本身就有原始的顺序,所以再次遍历一边s就好了…
Conclusion
我想到的是第一种,看到别人有第二种解法,顿时心累…不过记录下第一种方法好了,可以用两个dict来解决dict自动排序导致顺序打乱的问题。