力扣刷题0708

20. 有效的括号

给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。

题目链接:链接

自己理解题目:首先想着用两个列表分别添加左右括号,然后依次弹出,判断是否配对,写出代码但不能通过全部测试用例。

class Solution:
    def isValid(self, s: str) -> bool:
        
        dic={"(":")","{":"}","[":"]"}
        res=[]
        ans=[]
        if len(s)%2!=0:
            return False
        for i in s:
            if i in dic.keys():
                ans.append(i)
            if i in dic.values():
                res.append(i)
                if len(ans)!=0 and dic[ans.pop()]==i:
                    continue
                else:
                    return False
            if len(res)==len(s) or len(ans)==len(s):
                return False
        return True

看了视频链接自己改写后得到:

class Solution:
    def isValid(self, s: str) -> bool:
        
        dic={"(":")","{":"}","[":"]"}
        res=[]
        ans=[]
        if len(s)%2!=0:
            return False
        for i in s:
            if i in dic.keys():
                ans.append(dic[i])
            if i in dic.values():
                if len(ans)==0 or ans.pop(-1)!=i:
                    return False
        if len(ans)!=0:
            return False
        return True

参考答案:链接

# 方法一,仅使用栈,更省空间
class Solution:
    def isValid(self, s: str) -> bool:
        stack = []
        
        for item in s:
            if item == '(':
                stack.append(')')
            elif item == '[':
                stack.append(']')
            elif item == '{':
                stack.append('}')
            elif not stack or stack[-1] != item:
                return False
            else:
                stack.pop()
        
        return True if not stack else False
# 方法二,使用字典
class Solution:
    def isValid(self, s: str) -> bool:
        stack = []
        mapping = {
            '(': ')',
            '[': ']',
            '{': '}'
        }
        for item in s:
            if item in mapping.keys():
                stack.append(mapping[item])
            elif not stack or stack[-1] != item: 
                return False
            else: 
                stack.pop()
        return True if not stack else False

反思总结:由于栈结构的特殊性,非常适合做对称匹配类的题目。

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

给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。

在 S 上反复执行重复项删除操作,直到无法继续删除。

在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。

题目链接:链接

自己理解题目:第一想法是定义一个函数,查找字符串中的相邻的相等字符,然后删除,返回自己调用自己的返回值,主函数中调用这个函数即可。

def rm(s):
            n=0
            while n<(len(s)-2):
                for i in range(n+1,len(s)-1):
                    if s[n]==s[i]:
                        j=i+1
                        s=s[:n]+s[j:]
                n+=1
            return rm(s)
        rm(s)

看了答案修改后通过

class Solution:
    def removeDuplicates(self, s: str) -> str:
        l=[]
        n=0
        while n<len(s):
            if l and l[-1]==s[n]:
                l.pop()
            else:
                l.append(s[n])
            n+=1
        return "".join(l)

参考答案:

# 方法一,使用栈
class Solution:
    def removeDuplicates(self, s: str) -> str:
        res = list()
        for item in s:
            if res and res[-1] == item:
                res.pop()
            else:
                res.append(item)
        return "".join(res)  # 字符串拼接
# 方法二,使用双指针模拟栈,如果不让用栈可以作为备选方法。
class Solution:
    def removeDuplicates(self, s: str) -> str:
        res = list(s)
        slow = fast = 0
        length = len(res)

        while fast < length:
            # 如果一样直接换,不一样会把后面的填在slow的位置
            res[slow] = res[fast]#以输入abbaca为例,此时slow和fast都指向第二个b,
            
            # 如果发现和前一个一样,就退一格指针
            if slow > 0 and res[slow] == res[slow - 1]:
                slow -= 1#发现前一个相同时,slow后退到第一个b
            else:
                slow += 1
            fast += 1#fast仍向前指向至第二个a
            
        return ''.join(res[0: slow])

反思总结:双指针法还是没有很明白,还要加油学习

150. 逆波兰表达式求值

给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。

请你计算该表达式。返回一个表示表达式值的整数。

题目链接:链接

自己理解题目:逆波兰表达式是啥???后缀表达式。。。二叉树的后序遍历,计算机用后缀表达式可以更快的解决算术问题。

参考答案:

from operator import add, sub, mul

class Solution:
    op_map = {'+': add, '-': sub, '*': mul, '/': lambda x, y: int(x / y)}
    
    def evalRPN(self, tokens: List[str]) -> int:
        stack = []
        for token in tokens:
            if token not in {'+', '-', '*', '/'}:
                stack.append(int(token))
            else:
                op2 = stack.pop()
                op1 = stack.pop()
                stack.append(self.op_map[token](op1, op2))  # 第一个出来的在运算符后面
        return stack.pop()
class Solution:
    def evalRPN(self, tokens: List[str]) -> int:
        stack = []
        for item in tokens:
            if item not in {"+", "-", "*", "/"}:
                stack.append(item)
            else:
                first_num, second_num = stack.pop(), stack.pop()
                stack.append(
                    int(eval(f'{second_num} {item} {first_num}'))   # 第一个出来的在运算符后面
                )
        return int(stack.pop()) # 如果一开始只有一个数,那么会是字符串形式的

反思总结:思路是会了,加减乘除加载的模块不知道。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值