LeetCode314周赛 t3 + 写给自己的话

前言:

这道题我自己卡了很久,直到比赛结束也才想出两个题解,一个是模拟,一个是哈希表。

模拟超时了,哈希表没来得及实现。

最后看的灵神的视频才悟道的,自己写的哈希解法太丑陋了,我就不贴出来了。

写这篇文章目的是方便自己以后忘记了可以查,顺便分享一下自己的理解。

题目:

数据范围:

解题思路:

两个操作:

        1.删除字符串 s 的第一个,并将字符放到 t 的尾部

        2.删除字符串 t 最后一个字符,将它写到之上。

        这两句话是不是很相似?

        我们的数据结构 为 “后进先出” 原则,和我们的两个操作是一样的,那么我们就可以使用 来完成这道题。

想法:

从最小字符 a 开始查找,若当前最小字符已经没有了,那么就查找下一个最小字符,直到查找到 z

查看栈顶元素,栈顶元素 <= 当前最小字符,将栈顶推出,并将元素推入 ans 中(ans用来存储结果)

输出结果

代码实现:

from string import ascii_lowercase
def robotWithString(s: str) -> str:
    from collections import Counter
    cnt, ans, st = Counter(s), [], []
    asc = 0  # 从0 也就是 'a'开始查找最小字符
    for c in s:
        cnt[c] -= 1
        while asc < 25 and cnt[ascii_lowercase[asc]] == 0:
            asc += 1
        st.append(c)
        while st and st[-1] <= ascii_lowercase[asc]:  # 栈中所有小于等于 最小字符 的字符全部入 ans
            ans.append(st.pop())
    return ''.join(ans)

写给自己的结语:

不知不觉正式刷LC已经3个月了,我没有那些顶尖大学的聪明头脑,也没有他们的高智商,我学东西很慢,慢到我忍不住唾弃自己,学习数据结构这么久了,慢慢的遗忘之前的知识了。从这次比赛我充分认识到自己的不足。

从我接触编程开始,陆陆续续认识了许多志同道合的伙伴,有顶尖大学的学长,有专科小伙伴,也有已经在上班的大佬,一路上有他们的鼓励,安慰,共勉,我终于坚持下来了,现在LC已经成为我的习惯了。(在第一个月差点被劝退)

打完比赛看到我的刷题数量达到了333,哈哈哈,很吉利的一个数字,截张图。

 我很笨,但是我相信只要我持之以恒,坚持学习一定可以达到大佬们的高度的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值