1、解题思路:遍历字符串,依次判断元素在字符串中的个数是否为1,第一个为1的返回该元素的索引号,若整个字符串都没有个数为1的,则返回-1。
知识点:enumerate(序列):返回可迭代的序列中所有索引号和对应元素,元组形式 (索引, 元素)。
序列.count(...):统计某元素在序列中的个数。
class Solution:
def firstUniqChar(self, s: str) -> int:
for i,x in enumerate(s):
if s.count(x) == 1:
return i
return -1
2、解题思路:使用计数器统计出字符串中所有元素及其个数,再次遍历字符串,依次判断元素在计数器中的个数是否为1,若是,返回索引,若整个字符串都没有个数为1的,则返回-1。
知识点:collections.Counter(...):计数器,字典子类。统计序列中元素及其出现个数。
字典[键]:获取字典中键对应的值。或修改键对应的值:字典[键]=值。
class Solution:
def firstUniqChar(self, s: str) -> int:
import collections
adict = collections.Counter(s)
for i,x in enumerate(s):
if adict[x] == 1:
return i
return -1
3、(1)解题思路:使用字典统计出字符串中所有元素及其第一次出现的索引,若重复出现,则该元素在字典中对应的值为-1;再次遍历字典的所有值,在不是-1的值中找出最小的索引号,若没有,返回-1。
知识点:dict():创建空字典。即{ }。
len(序列):获取序列的长度。
字典.values():返回可迭代的字典中的所有值。
class Solution:
def firstUniqChar(self, s: str) -> int:
adict = dict()
n = len(s)
for i,x in enumerate(s):
if x in adict:
adict[x] = -1
else:
adict[x] = i
first = n
for i in adict.values():
if i != -1 and i < first:
first = i
if first == n:
return -1
return first
(2)解题思路:使用字典统计出字符串中所有元素及其第一次出现的索引,若重复出现,则该元素在字典中对应的值为字符串总长度加索引(方便后面获取最小值);再次遍历字典的所有值,找出最小的索引号。
知识点:min(...):获取最小值。
class Solution:
def firstUniqChar(self, s: str) -> int:
adict = dict()
n = len(s)
for i,x in enumerate(s):
if x in adict:
adict[x] = i + n
else:
adict[x] = i
result = min(adict.values())
return -1 if result > n else result
4、解题思路:使用字典统计出字符串中所有元素及其第一次出现的索引,若重复出现,则该元素在字典中对应的值为-1;使用队列依次以元组形式记录元素及其第一次出现的索引号,若是重复的元素从队列移除。最终队列为空,则返回-1,否则返回队列第一个元素中记录的索引号。
知识点:collections.deque():双端队列。左端进,右端出。也可以右端进,左端出。
队列.append():从队尾(右端)添加一个元素。
队列.popleft():从队头(左端)移除一个元素,并返回该元素。
class Solution:
def firstUniqChar(self, s: str) -> int:
import collections
adict = dict()
n = len(s)
q = collections.deque()
for i,x in enumerate(s):
if x not in adict:
adict[x] = i
q.append((s[i],i))
else:
adict[x] = -1
while q and adict[q[0][0]] == -1:
q.popleft()
return -1 if not q else q[0][-1]
5、解题思路:从字符串中依次筛选出所有出现次数为1的元素,列表形式记录,若空列表,则没有不重复的元素,返回-1,否则返回列表中第一个元素在字符串中对应的索引号。【该方法超出时间限制】
知识点:filter(predict, 可迭代对象):返回一个迭代器。筛选出所有符合条件的元素。
lambda:匿名函数。
序列.index(...):获取元素在序列中的索引号。
序列[索引]:获取序列中索引号对应的元素。
class Solution:
def firstUniqChar(self, s: str) -> int:
# 超出时间限制
alist = list(filter(lambda x:s.count(x)==1,s))
return -1 if len(alist)==0 else s.index(alist[0])
改进:遍历字符串,依次判断元素出现的次数是否为1,从字符串中过滤掉不满足条件的元素,获取第一个满足条件的元素及之后所有元素,列表形式记录,若空列表,则返回-1,否则返回列表中第一个元素在字符串中对应的索引号。
知识点:itertools.dropwhile(predict, 可迭代对象):返回一个迭代器。依次遍历可迭代对象,不满足条件的内容去除,第一个满足条件的内容及其之后所有内容全部返回。
class Solution:
def firstUniqChar(self, s: str) -> int:
import itertools
alist = list(itertools.dropwhile(lambda x:s.count(x)!=1, s))
return -1 if len(alist)==0 else s.index(alist[0])