首页 > 编程语言 >代码随想录算法训练营第十一天|20. 有效的括号、1047. 删除字符串中的所有相邻重复项、150. 逆波兰表达式求值

代码随想录算法训练营第十一天|20. 有效的括号、1047. 删除字符串中的所有相邻重复项、150. 逆波兰表达式求值

时间:2023-05-20 13:23:05浏览次数:48  
标签:第十一天 slow res 随想录 pop item 求值 stack append

【参考链接】

20. 有效的括号

【注意】

1.括号匹配是使用栈解决的经典问题。

2.这个命令最后进入a目录,系统是如何知道进入了a目录呢 ,这就是栈的应用(其实可以出一道相应的面试题了)。

3.有三种不匹配的情况,第一种情况,字符串里左方向的括号多余了 ;第二种情况,括号没有多余,但是 括号的类型没有匹配上;第三种情况,字符串里右方向的括号多余了。

【代码】

1.剪枝操作:字符串如果是奇数,直接就是不匹配。

 1 class Solution(object):
 2     def isValid(self, s):
 3         """
 4         :type s: str
 5         :rtype: bool
 6         """
 7         #方法1,仅使用栈
 8         stack = []
 9 
10         for item in s:
11             if item == '(':
12                 stack.append(')')
13             elif item == '{':
14                 stack.append('}')
15             elif item == '[':
16                 stack.append(']')
17             elif not stack or stack[-1] != item: #栈为空的话,或和右括号不匹配的时候,对应2,3情况
18                 return False
19             else:
20                 stack.pop()
21         
22         return True if not stack else False #s遍历完之后,如果栈不为空,对应第1种情况
23 
24         #方法2.使用字典
25         stack = []
26         mapping = {
27             '(':')',
28             '[':']',
29             '{':'}'
30         }
31 
32         for item in s:
33             if item in mapping.keys():
34                 stack.append(mapping[item])
35             elif not stack or stack[-1] != item:
36                 return False
37             else:
38                 stack.pop()
39         
40         return True if not stack else False

1047. 删除字符串中的所有相邻重复项

【注意】

1.栈帮助我们记录了 遍历数组当前元素时候,前一个元素是什么。

2.字符串模拟栈。

【代码】

 1 class Solution(object):
 2     def removeDuplicates(self, s):
 3         """
 4         :type s: str
 5         :rtype: str
 6         """
 7         #方法1.使用栈
 8         res = list()
 9 
10         for item in s:
11             if res and res[-1] == item:
12                 res.pop()
13             else:
14                 res.append(item)
15         
16         return ''.join(res) #字符串拼接
17 
18         #方法2.使用双指针模拟栈
19         res = list(s) #字符串转成列表
20         slow = fast = 0 #双指针
21         n = len(res)
22 
23         while fast < n:
24             #如果一样直接换,不一样会把后面的填在slow的位置
25             res[slow] = res[fast]
26 
27             #如果发现和前一个一样,就退一格指针
28             if slow > 0 and res[slow] == res[slow-1]:
29                 slow -= 1
30             else:
31                 slow += 1
32             fast += 1
33         
34         return ''.join(res[0:slow])

150. 逆波兰表达式求值

【注意】

1.逆波兰表达式就是一种后缀表达式。计算机进行顺序处理,不用关心优先级。

2.遇见数字就存放在栈里,遇见运算符就从栈里取数字,做一个计算,再把计算完的数字存放在栈里。

【代码】

 1 class Solution(object):
 2     op_map = {'+':add, '-':sub, '*':mul, '/':lambda x,y: int(x/y)}
 3     def evalRPN(self, tokens):
 4         """
 5         :type tokens: List[str]
 6         :rtype: int
 7         """
 8         # stack = []
 9         # for token in tokens:
10         #     if token not in {'+','-','*','/'}:
11         #         stack.append(int(token))
12         #     else:
13         #         op1 = stack.pop()
14         #         op2 = stack.pop()
15         #         stack.append(self.op_map[token](op1,op2))
16         
17         # return stack.pop()
18 
19         #方法2.使用eval 对字符串进行计算
20         stack = []
21         for item in tokens:
22             if item not in {'+','-','*','/'}:
23                 stack.append(item)
24             else:
25                 first_num, second_num = stack.pop(), stack.pop()
26                 # 第一个出来的在运算符后面
27                 stack.append(int(eval(f"{second_num}{item}{first_num}"))) #力扣上提示该语句语法错误,为什么?
28         
29         # 如果一开始只有一个数,那么会是字符串形式的
30         return int(stack.pop())

 

标签:第十一天,slow,res,随想录,pop,item,求值,stack,append
From: https://www.cnblogs.com/wuyijia/p/17416774.html

相关文章

  • 代码随想录Day6
    链表的复习章节  哈希的概念和应用:https://programmercarl.com/哈希表理论基础.html#哈希函数当我们想使用哈希法来解决问题的时候,我们一般会选择如下三种数据结构。数组set(集合)map(映射)这里数组就没啥可说的了,我们来看一下set。 Leetcode242时间复杂度O(N......
  • 代码随想录算法训练营第十天|232. 用栈实现队列、225. 用队列实现栈
    【参考链接】1.栈提供push和pop等等接口,所有元素必须符合先进后出规则,所以栈不提供走访功能,也不提供迭代器(iterator)。不像是set或者map提供迭代器iterator来遍历所有元素。2.栈是以底层容器完成其所有的工作,对外提供统一的接口,底层容器是可插拔的(也就是说我们可以控制使......
  • 代码随想录算法训练营第九天|28. 找出字符串中第一个匹配项的下标、459. 重复的子字符
    【参考链接】28.找出字符串中第一个匹配项的下标【注意】1.kmp解决的就是字符串匹配的问题。2.kmp如何知道匹配过哪些字符串,并跳到匹配过的内容后面的字符。---前缀表3.找到一个子字符串里它的最长相等前后缀。4.前缀是包含首字母,不包含尾字母的所有子串;后缀只包含尾字母,不......
  • 代码随想录算法训练营第8天 | ● 344.反转字符串 ● 541. 反转字符串II ● 剑指Offer
     第四章 字符串part01  今日任务  ●  344.反转字符串●  541. 反转字符串II●  剑指Offer 05.替换空格●  151.翻转字符串里的单词●  剑指Offer58-II.左旋转字符串  详细布置   344.反转字符串  建议: 本题是字符串基础题目,就是考察......
  • 代码随想录算法训练营第七天|454. 四数相加 II、383. 赎金信、15. 三数之和、18. 四数
    【参考链接】454.四数相加II【注意】1.a+b作为key,出现次数作为value,0-(c+d)有没有在map集合里出现过,出现的次数做统计。遍历两个数组时间复杂度为O(n2)。【代码】1classSolution(object):2deffourSumCount(self,nums1,nums2,nums3,nums4):3"""......
  • 代码随想录算法训练营第7天 | ● 454.四数相加II ● 383. 赎金信 ● 15. 三数之和
     第三章 哈希表part02  今日任务  ●  454.四数相加II ●  383. 赎金信 ●  15. 三数之和 ●  18. 四数之和 ●  总结    详细布置   454.四数相加II  建议:本题是 使用map 巧妙解决的问题,好好体会一下 哈希法 如何提高程序......
  • SICP:元循环求值器(Python实现)
    求值器完整实现代码我已经上传到了GitHub仓库:TinySCM,感兴趣的童鞋可以前往查看。这里顺便强烈推荐UCBerkeley的同名课程CS61A。在这个层次结构的最底层是对象语言。对象语言只涉及特定的域,而不涉及对象语言本身(比如它们的文法规则,或其中的其体句子)。如要涉及它们,则要有一种元......
  • 代码随想录算法训练营第6天 | 哈希表理论基础, 242.有效的字母异位词, 349. 两个数组
     第三章 哈希表part01  今日任务  ●  哈希表理论基础 ●  242.有效的字母异位词 ●  349. 两个数组的交集 ●  202. 快乐数●  1. 两数之和     详细布置   哈希表理论基础  建议:大家要了解哈希表的内部实现原理,哈希函数,哈希......
  • 代码随想录day4|leetcode24,19,142
    Leetcode24我一开始是直接模拟,通过考虑后面有没有secondpoint和thirdpoint的情况下进行的编程,非常的冗长。后面阅读了推荐的答案,发现在编写链表题目的时候,可以使用虚拟头节点,这样写出来的结果非常的简洁明了,并且一二两个就可以开始重复进行 关于判断语句的如果是and连接......
  • LeetCode 150. 逆波兰表达式求值
    题目链接:LeetCode150.逆波兰表达式求值题意:给你一个字符串数组tokens,表示一个根据逆波兰表示法表示的算术表达式。请你计算该表达式。返回一个表示表达式值的整数。解题思路:(栈操作)O(n)遍历所有元素。如果当前元素是整数,则压入栈;如果是运算符,则将栈顶两个元素弹出......