387. 字符串中的第一个唯一字符(Python)

题目

难度:★★☆☆☆
类型:字符串

给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -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

如有疑问或建议,欢迎评论区留言~

你可能感兴趣的:(387. 字符串中的第一个唯一字符(Python))