复杂度分析

时间复杂度:由于判断当前字符是否在栈上存在需要 O(N)O(N) 的时间,因此总的时间复杂度就是 O(N ^ 2)O(N 
2
 ),其中 NN 为字符串长度。
空间复杂度:我们使用了额外的栈来存储数字,因此空间复杂度为 O(N)O(N),其中 NN 为字符串长度。
查询给定字符是否在一个序列中存在的方法。根本上来说,有两种可能:

有序序列: 可以二分法,时间复杂度大致是 O(N)O(N)。
无序序列: 可以使用遍历的方式,最坏的情况下时间复杂度为 O(N)O(N)。我们也可以使用空间换时间的方式,使用 NN的空间 换取 O(1)O(1)的时间复杂度。
由于本题中的 stack 并不是有序的,因此我们的优化点考虑空间换时间。而由于每种字符仅可以出现一次,这里使用 hashset 即可。

代码(Python)

class Solution:def removeDuplicateLetters(self, s) -> int:stack = []seen = set()remain_counter = collections.Counter(s)for c in s:if c not in seen:while stack and c < stack[-1] and  remain_counter[stack[-1]] > 0:seen.discard(stack.pop())seen.add(c)stack.append(c)remain_counter[c] -= 1return ''.join(stack)
class Solution:def removeDuplicateLetters(self, s) ->int:stack =[]seen =set()remain_counter = collections.Counter(s)for c in s:if c not in seen:while stack and c < stack[-] and remain_counter[stack[-1]] > 0:seen.discard(stack.pop())seen.add(c)stack.append(c)remain_counter[c] -= 1return ''.join(stack)
class Solution:def removeDuplicateLetters(self, s) -> int:stack =[]seen =set()remain_counter = collections.Counter(s)for c in s:if c not in seen:while stack and c< stack[-1] and remain_counter[stack[-1]] > 0:seen.discard(stack.pop())seen.add(c)stack.append(c)remain_counter[c] -=1return ''.join(stack)
class Solution:def removeDuplicateLetters(self, s) -> int:stack =[]seen =set()remain_counter = collections.Counter(s)for c in s:if c not in seen:while stack and c < stack[-1] and remain_counter[stack[-1]] > 0:seen.discard(stack.pop())seen.add(c)stack.append(c)remain_counter[c] -= 1return ''.join(stack)

2021-09-09316. 去除重复字母 栈相关推荐

  1. 力扣- -去除重复字母

    力扣- -去除重复字母 文章目录 力扣- -去除重复字母 一.题目描述 二.分析 三.代码 四.问题描述 五.代码 一.题目描述 二.分析 题目的要求总结出来有三点: 要求一.要去重. 要求二.去重字 ...

  2. 20200213:去除重复字母(leetcode316)

    去除重复字母 题目 思路与算法 代码实现 题目 思路与算法 首先对字符串进行遍历,将当前字符串依次入栈, 注意入栈的条件: 新入栈的元素在栈内没有出现过,必须是未出现过的元素 新入栈的元素如果比栈顶元 ...

  3. LeetCode 练习——316. 去除重复字母

    文章目录 1.题目描述 2.思路 2.1 代码 2.2 测试结果 3.总结 1.题目描述 去除重复字母 给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次.需保证 返回结果的字典 ...

  4. 316. 去除重复字母

    链接:316. 去除重复字母 题解:https://leetcode-cn.com/problems/remove-duplicate-letters/solution/qu-chu-zhong-fu ...

  5. 316 Remove Duplicate Letters 去除重复字母

    给定一个仅包含小写字母的字符串,去除重复的字母使得所有字母出现且仅出现一次.你必须保证返回结果是所有可能结果中的以字典排序的最短结果. 例如: 给定 "bcabc" 返回 &quo ...

  6. leetcode 316. 去除重复字母(单调栈)

    给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次.需保证 返回结果的字典序最小(要求不能打乱其他字符的相对位置). 注意:该题与 1081 https://leetcode-c ...

  7. LeetCode 316. 去除重复字母 / 1081. 不同字符的最小子序列(单调栈)

    文章目录 1. 题目 2. 解题 1. 题目 LC 316: 给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次.需保证 返回结果的字典序最小(要求不能打乱其他字符的相对位置). ...

  8. 贪心+单调栈——去除重复字母(Leetcode 316)

    题目选自Leetcode 316 第一步当然是好好读题~ 有的人读着很快啊,啪 一下 哦原来就是个排序 哒哒哒一分钟解决战斗,欸 怎么全错了. 再仔细一看,原来少了重要的条件--要求不能打乱其他字符的 ...

  9. leetcode 316. Remove Duplicate Letters | 316. 去除重复字母(单调栈解法)

    题目 https://leetcode.com/problems/remove-duplicate-letters 题解 关于什么是"字典序" 字典序,换成数字更好理解一点 a:1 ...

  10. 贪心/栈 - 去除重复字母

    题目链接 对于一个字符串,删除满足s[i]>s[i+1]s[i] > s[i+1]s[i]>s[i+1]且iii最小的那个字符,使得删除后的字典序最小,基于这个思路,可以在遍历的时候 ...

最新文章

  1. ASP.NET MVC中你必须知道的13个扩展点
  2. python3反爬虫原理与绕过实战 网盘_Python 3反爬虫原理与绕过实战
  3. vue+node实现中间层同步调用接口
  4. python并发编程之多线程
  5. [Oracle]行列转换(行合并与拆分)
  6. ZOJ 2527题解
  7. Media Queries移动设备样式
  8. dnf体验服显示服务器爆满,DNF:体验服刚更新就爆满,官方临时加频道,100级真那么好玩?...
  9. 数据库理论:计算机数据库技术在信息管理中的应用分析
  10. Python3制作网易云音乐下载器!付费的你猜能下载吗!
  11. 每次离开总是 装做轻松的样子 微笑着说回去吧 转身泪湿眼底
  12. 寒假第一周 总结与反思
  13. EXE文件结构及读取方法 1
  14. 【肝帝一周总结:全网最全最细】☀️Mysql 索引数据结构详解与索引优化☀️《❤️记得收藏❤️》
  15. 报表中的地图怎么做?
  16. iOS 9:四、设置信任
  17. C++类模板怎么写在单独的头文件和源文件中
  18. asp数据库服务器端连接错误信息,主数据库连接出错,请检查数据库连接字符串!...
  19. yota3墨水屏调节对比度_YOTA3墨水屏“直通”技术取代旧“投射”功能,体验全面升级-非常在线...
  20. Qt 自定义日历控件

热门文章

  1. android 判断主线程_腾讯Android面试:Handler中有Loop死循环,为什么没有阻塞主线程...
  2. prototype.js学习(3)函数绑定
  3. db2 reorg(转)
  4. 如何把滑动条变好看一点
  5. weblogic设置classpath、debug端口和log目录
  6. DM642图像处理程序的主要结构
  7. 楼道声光控灯闪烁_照明灯闪烁其中一个原因就是它
  8. 无法发送电子邮件,可能原因:您的主机禁用了mail()函数
  9. wordpress不登陆后台禁用插件
  10. MySQL中授权(grant)和撤销授权(revoke)