在一个长为 
 字符串中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).(从0开始计数)
	数据范围:
,且字符串只有字母组成。
	要求:空间复杂度 
,时间复杂度 
 
                                        class Solution: def FirstNotRepeatingChar(self, s): # write code here if not s: return -1 for i in range(len(s)): if s[i] not in s[i+1:] and s[i] not in s[:i]: return i return -1
1、整体思路的时间复杂度为O(n)。采用字典的思路。
2、循环遍历输入的字符串s
(1)当字符不存在于字典时,将字符作为键添加,同时赋值为1。
(2)当字符存在于字典时,将其值+1。
3、要求字典在添加的时候是,有序添加。(这里有个坑:python3.8默认是有序添加;但是python2.7会根据键,将字典中的键值对自动排序。所以需要引入collections中的OrderedDict)
from collections import OrderedDict d = OrderedDict()
4、因为字典中的键值对是有序添加,所以我们只需要在字典里面找到,第一个值为1的键,它就是我们需要的字符。
5、返回该字符在s字符串中的位置。
# -*- coding:utf-8 -*- from collections import OrderedDict class Solution: def FirstNotRepeatingChar(self, s): # write code here if len(s)<=0 or len(s)>10000: return -1 result = OrderedDict() for i in s: if i not in result.keys(): result.setdefault(i,1) else: result[i]+=1 new_key=list(result.keys()) new_value=list(result.values()) tempStr=None for key,value in zip(new_key,new_value): if value==1: tempStr = key break if tempStr: return s.index(key) else: return -1
def FirstNoteRepeatingChar(s):
    dict = {}
    res = None
    for item in s:
        dict[item] = dict.get(item,0)+1
    for item in dict:
        if dict[item]==1:
            res = item
            break
    #return item
    for i,item in enumerate(s):
        if item==res:
            return i
    return -1
s = 'NXWtnzyoHoBhUJaPauJaAitLWNMlkKwDYbbigdMMaYfkVPhGZcrEwp'
FirstNoteRepeatingChar(s)
 用了字典,在自己的ide编译,结果都没有问题,牛客上的结果就不一样,好奇怪,搞不明白了
                                                                                    class Solution:
    def FirstNotRepeatingChar(self, s):          
        if not s:
            return -1
        # 新建一个字典
        dic = {}
        for item in s:
            # 如果字符不存在字典的keys中,就把其和对应的索引添加至字典的key-value
            if not dic.has_key(item):
                dic[item] = s.index(item)
            # 如果存在,就把当前字符key对应的value,设置为一个其它独特的值
            else:
                dic[item] = 10001 # 这里是由于题目说了字符串最长10000
        # 然后返回字典中value的最小值就可以了
        return min(dic.values()) if min(dic.values())!=10001 else -1
 class Solution:
    def FirstNotRepeatingChar(self, s):
        # write code here
        dict={}
        res = -1
        for i in s:
            if i not in dict:
                dict[i]=1
            else:
                dict[i]+=1
        for i in range(len(s)):
            if dict[s[i]]==1:
                res = i
                break
        return res class Solution:
    def FirstNotRepeatingChar(self, s):
        slen = len(s)
        if slen == 0:
            return -1
        if slen == 1:
            return 0
        ret = dict()
        for i in s:
            if i not in ret:
                ret[i] = 1
            else:
                ret[i] += 1
        for i in ret.items():
            if i[1] == 1:
                return s.index(i[0])
        return -1   测试用例:google
 期望输出:4
 你的输出:5 
# -*- coding:utf-8 -*-
"""
空间换时间
"""
class Solution:
    def FirstNotRepeatingChar(self, s):
        """
        Time: O(n)
        Space: O(1)
        :param s:
        :return:
        """
        d = {}
        for element in s:
            d[element] = d.get(element,0) + 1
        for i in range(len(s)):
            if d[s[i]] == 1:
                return i
        return -1
s = Solution()
ans = s.FirstNotRepeatingChar("  ")
print(ans) # -*- coding:utf-8 -*-
class Solution:
    def __init__(self):
        self.list1={}
    def FirstNotRepeatingChar(self, s):
        (936)# write code here
        if s=='':
            return -1
        for i in range(len(s)):
            if s[i] not in self.list1:
                self.list1[s[i]]=[i,1]
            else:
                self.list1[s[i]][1]+=1
        for key,value in self.list1.items():
            if value[1]>1:
                self.list1.pop(key)
        a=self.list1.values()
        a.sort()
        return a[0][0] 这个题采用的是字典的方法,记录每个字符出现的次数,等循环完一遍后,再将其中出现次数多余一个的字符从字典中去除中去,然后返回第一个只出现一次字符的位置就可以了