<LeetCode天梯>Day017 字符串中的第一个唯一字符(哈希表+find&rfind) | 初级算法 | Python

简介: <LeetCode天梯>Day017 字符串中的第一个唯一字符(哈希表+find&rfind) | 初级算法 | Python

以下为我的天梯积分规则:


每日至少一题:一题积分+10分

若多做了一题(或多一种方法解答),则当日积分+20分(+10+10)

若做了三道以上,则从第三题开始算+20分(如:做了三道题则积分-10+10+20=40;做了四道题则积分–10+10+20+20=60)


初始分为100分

若差一天没做题,则扣积分-10分(周六、周日除外注:休息)

坚持!!!


初级算法

刷题目录

字符串


image.png

image.png

题干

给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。


示例:


s = “leetcode”

返回 0


s = “loveleetcode”

返回 2


提示:你可以假定该字符串只包含小写字母。


哈希表

分析:


本题找到不重复的字符,很明显的暗示,让我们用字典,哈希表来解题。通过字典确定每个字符的个数,然后再选出只有单次出现的字符,且选出最先出现的,返回其相对应的索引号。

class Solution:
    def firstUniqChar(self, s: str) -> int:
    # 哈希表
        hashmap = {}
        for i in s:
            if i not in hashmap:
                hashmap.update({i:s.count(i)}) # 将数字各自出现的个数存入哈希表中
        for key,value in hashmap.items():   # 遍历哈希表的键值
            if hashmap[key] == 1:
                return s.index(key)
        return -1

哈希表的速度表现还不错的!~

image.png

索引count

分析:

我们还可以将字符串取为单个字符成list后,通过count计数,看在其中的个数是多少,遍历所有项,删除多余的项,若大于1,则不返回;若仅有一个字符,则返回其对应的索引号。若不存在,则返回-1.

class Solution:
    def firstUniqChar(self, s: str) -> int:
        # 将s中的单个字母取出来为单个字符串
        list1 = list(map(str, s))
        n = len(list1)
    temp = 0
        list2 = list(map(str, s))
        for i in list1:
            if list1.count(i) > 1:
                list2.remove(i)   # 如果有,则删除list2里的对应值
        # 判断是否存在上述情况
        for j in list1:
            if list1.count(j) == 1:
                temp += 1
        if temp > 0:
            return list1.index(list2[0])   # 查询list2中删除完
        return -1

额,勇气可嘉,超出时间限制了,感觉不应该的啊

image.png

我们再进行优化一下

将temp的判断再细化一下

不遍历所有直接读取list2的参数,看是否删除了相同的值之后还存在值,如果还有则,返回第一个,如果没有,则返回-1。

class Solution:
    def firstUniqChar(self, s: str) -> int:
        # 将s中的单个字母取出来为单个字符串
        list1 = list(map(str, s))
        n = len(list1)
    list2 = list(map(str, s))
        for i in list1:
            if list1.count(i) > 1:
                list2.remove(i)   # 如果有,则删除list2里的对应值
        # 判断是否存在上述情况
        if len(list2) > 0:
            return list1.index(list2[0])   # 查询list2中删除完
        return -1

还是太菜了,超出时间限制了

image.png

不过肯定是能用的。

咱们只用内置函数试试

class Solution:
    def firstUniqChar(self, s: str) -> int:
    for i in range(len(s)):
            if s.count(s[i]) == 1:
                return i
        return -1

image.png

实时证明,确实很慢很慢,不考虑了。

两次遍历

我们可以使用两次遍历来输出,第一次遍历,将每个数字出现的次数保存在一个list中,第二次遍历这个list,如果一遇到值为1,则输出1所在的索引值,否则,返回-1.

class Solution:
    def firstUniqChar(self, s: str) -> int:
    c1 = []
        n = len(s)
        for i in range(n):
            c1.append(s.count(s[i]))
        for j in range(n):
            if c1[j] == 1:
                return j
        return -1

勇气可嘉,怎么还是超出时间限制啊o(╥﹏╥)o

image.png

find和rfind

此法骨骼极其清奇,简直不要太妙了。一个从前查找,一个从后查找,如果下标相等,说明只出现了一次

class Solution:
    def firstUniqChar(self, s: str) -> int:
    for x in s:
            if s.find(x) == s.rfind(x):
                return s.find(x)
        return -1

image.png


相关文章
|
5月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
130 2
|
3月前
|
算法 安全 Go
Python与Go语言中的哈希算法实现及对比分析
Python与Go语言中的哈希算法实现及对比分析
53 0
|
4月前
|
Python Windows
Python:执行py命令,提示: Can‘t find a default Python.
Python:执行py命令,提示: Can‘t find a default Python.
|
5月前
|
JavaScript 前端开发 Python
成功解决:Can‘t find Python executable “python“, you can set the PYTHON env variable.
这篇文章分享了作者在运行前端Vue项目时遇到的关于Python执行环境的问题和解决方法。问题是由于找不到Python可执行文件导致的编译错误,解决方法包括安装编译环境、卸载并重新安装出现问题的`node-sass`包,并重新执行`npm install`和`npm run dev`。
成功解决:Can‘t find Python executable “python“, you can set the PYTHON env variable.
|
5月前
|
索引 Python
Python中的find()和count()方法详解
Python中的find()和count()方法详解
|
5月前
|
数据安全/隐私保护 Python
Python 解压还密码的压缩文件 LookupError: Couldn't find path to unrar library.
Python 解压还密码的压缩文件 LookupError: Couldn't find path to unrar library.
85 2
|
5月前
|
算法 Python
【Leetcode刷题Python】 LeetCode 2038. 如果相邻两个颜色均相同则删除当前颜色
本文介绍了LeetCode 2038题的解法,题目要求在一个由'A'和'B'组成的字符串中,按照特定规则轮流删除颜色片段,判断Alice是否能够获胜,并提供了Python的实现代码。
60 3
|
5月前
|
算法 Python
【Leetcode刷题Python】剑指 Offer 33. 二叉搜索树的后序遍历序列
本文提供了一种Python算法,用以判断给定整数数组是否为某二叉搜索树的后序遍历结果,通过识别根节点并递归验证左右子树的值是否满足二叉搜索树的性质。
28 3
|
5月前
|
Python
【Leetcode刷题Python】50. Pow(x, n)
本文介绍了LeetCode第50题"Pow(x, n)"的解法,题目要求实现计算x的n次幂的函数,文章提供了递归分治法的详细解析和Python实现代码。
34 1
|
5月前
|
Python
【Leetcode刷题Python】LeetCode 478. 在圆内随机生成点
本文介绍了LeetCode 478题的解法,题目要求在给定圆的半径和圆心位置的情况下实现在圆内均匀随机生成点的功能,并提供了Python的实现代码。
37 1