<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


目录
打赏
0
0
0
0
27
分享
相关文章
基于EM期望最大化算法的GMM参数估计与三维数据分类系统python源码
本内容展示了基于EM算法的高斯混合模型(GMM)聚类实现,包含完整Python代码、运行效果图及理论解析。程序使用三维数据进行演示,涵盖误差计算、模型参数更新、结果可视化等关键步骤,并附有详细注释与操作视频,适合学习EM算法与GMM模型的原理及应用。
企业上网监控系统中红黑树数据结构的 Python 算法实现与应用研究
企业上网监控系统需高效处理海量数据,传统数据结构存在性能瓶颈。红黑树通过自平衡机制,确保查找、插入、删除操作的时间复杂度稳定在 O(log n),适用于网络记录存储、设备信息维护及安全事件排序等场景。本文分析红黑树的理论基础、应用场景及 Python 实现,并探讨其在企业监控系统中的实践价值,提升系统性能与稳定性。
17 1
|
12天前
|
基于 Python 跳表算法的局域网网络监控软件动态数据索引优化策略研究
局域网网络监控软件需高效处理终端行为数据,跳表作为一种基于概率平衡的动态数据结构,具备高效的插入、删除与查询性能(平均时间复杂度为O(log n)),适用于高频数据写入和随机查询场景。本文深入解析跳表原理,探讨其在局域网监控中的适配性,并提供基于Python的完整实现方案,优化终端会话管理,提升系统响应性能。
34 4
人工智能算法python程序运行环境安装步骤整理
本教程详细介绍Python与AI开发环境的配置步骤,涵盖软件下载、VS2017安装、Anaconda配置、PyCharm设置及组件安装等内容,适用于Windows系统,助你快速搭建开发环境。
|
2月前
|
Apriori算法的Python实例演示
经过运行,你会看到一些集合出现,每个集合的支持度也会给出。这些集合就是你想要的,经常一起被购买的商品组合。不要忘记,`min_support`参数将决定频繁项集的数量和大小,你可以根据自己的需要进行更改。
122 18
论上网限制软件中 Python 动态衰减权重算法于行为管控领域的创新性应用
在网络安全与行为管理的学术语境中,上网限制软件面临着精准识别并管控用户不合规网络请求的复杂任务。传统的基于静态规则库或固定阈值的策略,在实践中暴露出较高的误判率与较差的动态适应性。本研究引入一种基于 “动态衰减权重算法” 的优化策略,融合时间序列分析与权重衰减机制,旨在显著提升上网限制软件的实时决策效能。
77 2
Python中利用遗传算法探索迷宫出路
本文探讨了如何利用Python和遗传算法解决迷宫问题。迷宫建模通过二维数组实现,0表示通路,1为墙壁,'S'和'E'分别代表起点与终点。遗传算法的核心包括个体编码(路径方向序列)、适应度函数(评估路径有效性)、选择、交叉和变异操作。通过迭代优化,算法逐步生成更优路径,最终找到从起点到终点的最佳解决方案。文末还展示了结果可视化方法及遗传算法的应用前景。
基于 Python 哈希表算法的局域网网络监控工具:实现高效数据管理的核心技术
在当下数字化办公的环境中,局域网网络监控工具已成为保障企业网络安全、确保其高效运行的核心手段。此类工具通过对网络数据的收集、分析与管理,赋予企业实时洞察网络活动的能力。而在其运行机制背后,数据结构与算法发挥着关键作用。本文聚焦于 PHP 语言中的哈希表算法,深入探究其在局域网网络监控工具中的应用方式及所具备的优势。
106 7
|
3月前
|
【LeetCode 热题100】394:字符串解码(详细解析)(Go语言版)
本文详细解析了 LeetCode 热题 394:字符串解码。题目要求对编码字符串如 `k[encoded_string]` 进行解码,其中 `encoded_string` 需重复 `k` 次。文章提供了两种解法:使用栈模拟和递归 DFS,并附有 Go 语言实现代码。栈解法通过数字栈与字符串栈记录状态,适合迭代;递归解法则利用函数调用处理嵌套结构,代码更简洁。两者时间复杂度均为 O(n),但递归需注意栈深度问题。文章还总结了解题注意事项及适用场景,帮助读者更好地掌握字符串嵌套解析技巧。
92 6

热门文章

最新文章

推荐镜像

更多
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问