【Python3】【力扣题】387. 字符串中的第一个唯一字符

【力扣题】题目描述:

【Python3】代码:

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])

最近更新

  1. TCP协议是安全的吗?

    2024-01-16 15:16:06       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-16 15:16:06       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-16 15:16:06       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-16 15:16:06       20 阅读

热门阅读

  1. 嵌入式工程师必须掌握的几种系统架构

    2024-01-16 15:16:06       32 阅读
  2. 【数据库原理】(29)数据库设计-需求分析阶段

    2024-01-16 15:16:06       37 阅读
  3. Golang 通道输入输出学习(同刚上手的小新手)

    2024-01-16 15:16:06       34 阅读
  4. 33、病隙随笔——浅聊脑机接口BCI

    2024-01-16 15:16:06       30 阅读
  5. 指针及其用法

    2024-01-16 15:16:06       34 阅读
  6. ffmpeg 实用命令 -- 截取视频

    2024-01-16 15:16:06       27 阅读
  7. Pandas实战100例 | 案例 31: 转换为分类数据

    2024-01-16 15:16:06       34 阅读
  8. 【工作周志】240108-240114

    2024-01-16 15:16:06       34 阅读
  9. 【笔记】Helm-3 主题-4 库类型Chart

    2024-01-16 15:16:06       31 阅读