题目
难度:★★☆☆☆
类型:字符串
给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。
注意事项:您可以假定该字符串只包含小写字母。
示例
s = "leetcode"
返回 0.
s = "loveleetcode",
返回 2.
解答
方案1:一趟遍历
这里,我们首先构造一个字典(c_record),字典的键是输入字符串中出现的字符c,字典的值也是一个字典,包含当前字符c出现的次数及其第一个出现的位置,字典构建完成后,我们把第一个只出现一次的字符检测出来,并且根据字典获得该字符第一个出现的位置即可。
class Solution:
def firstUniqChar(self, s):
c_record = {} # 记录字符的出现次数及其第一个出现的位置
chs_only_once = [] # 统计一下只出现过一次的字符
for i, c in enumerate(s): # 再次遍历s中的字符,获得下标及其对应字符
if c in c_record:
c_record[c]['frequency'] += 1
if c_record[c]['frequency'] == 2:
chs_only_once.remove(c) # 出现次数超过1次了,从列表中删掉该元素
else:
c_record[c] = {'frequency': 1, 'first appear': i}
chs_only_once.append(c)
if len(chs_only_once) > 0: # 如果只出现过一次的字符多于一个
first_ch = chs_only_once[0] # 拿出其中第一个字符
return c_record[first_ch]['first appear'] # 取出该字符第一次出现位置
else: # 没有出现过一次的字符
return -1 # 返回-1
如果我们输入的字符串是“love leetcode”,那么我们获得的c_record字典为:
{
'l': {'frequency': 2, 'first appear': 0}
'o': {'frequency': 2, 'first appear': 1}
'v': {'frequency': 1, 'first appear': 2}
'e': {'frequency': 4, 'first appear': 3}
' ': {'frequency': 1, 'first appear': 4}
't': {'frequency': 1, 'first appear': 8}
'c': {'frequency': 1, 'first appear': 9}
'd': {'frequency': 1, 'first appear': 11}
}
方案2:使用python库Counter
我们使用Counter统计每一个字符出现的次数,然后遍历原始字符串,从字典中获得当前字符出现的次数,将只出现过一次的字符的位置返回即可。
from collections import Counter
class Solution:
def firstUniqChar(self, s):
c_counter = Counter(s) # 获得字符计数器
for c in s: # 再次遍历s中的字符
if c_counter[c] <= 1: # 如果发现只出现过一次
return s.index(c) # 返回第一次出现的位置
else: # 如果没有找到
return -1 # 返回-1
方案3:使用in
对于每一个字符,如果该字符在其他部分中没有出现过,则该字符串中该字符只出现一次。
class Solution:
def firstUniqChar1(self, s):
for i in range(len(s)):
if s[i] not in (s[:i]+s[i+1:]):
return i
return -1
如有疑问或建议,欢迎评论区留言~