leecode 之20 有效的括号

题目的描述:

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

有效字符串需满足:

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

方法一:解题思路:
主要思想是利用栈的思想,依次匹配字符串中的子字符串,并进行删除。
1:判断字符串长度的奇偶数
2:依次判断字符串中每一个字符的情况:
①判断首字符串的左右括号情况,若为左,直接添加到栈(后进先出)中;若为右,返回为‘false’
②判断首字符后的其他字符的左右情况,若为左,直接添加到栈中;
③若为右,弹出栈中的元素与该字符串进行匹配(判断栈是否为空),若为空或者不匹配,则返回‘false’
3:最后判断栈是否为空,若为空,则true,否则false
& 字符串S的元素a下标索引方式:s.index(a)
class Solution:
    def isValid(str):
        left = ['{', '[', '(']
        right = ['}', ']', ')']
        stack = []
        if len(str) % 2 is not 0: # 余数是否是0来判断奇偶数
            print("字符串长度是奇数")
            return False
        else:
            for char in str:
                if char in left or char in right:
                    if str.find(char) == 0:  # 是否是第一个元素
                        if char in right:
                            print("false")
                            return False
                        else:
                            stack.append(char)
                    else:
                        if char in left:  # 左括号直接入栈
                            stack.append(char)
                        else:  # 如果是右括号
                            if len(stack)==0 or (len(stack)!=0 and (left.index(stack.pop()) != right.index(char))):
                                print("栈为空或者不匹配")
                                return False
                else:
                    print("存在非法字符")
                    return False
            if len(stack)!=0:
                print("栈不空")
                return False
            else:
                print("合法字符串")
                return True
str="()"
str="()[]{}"
str="(]"
str="{[]}"
a=Solution
a.isValid(str)

 

方法二:解题思路:
主要思想是利用栈的思想,依次匹配字符串中的子字符串,并进行删除。
1:判断字符串长度的奇偶数
2:依次判断字符串中每一个字符的情况:
①利用字典的特点,判断每一个字符是否是左括号,直接添加到栈中;
②考虑到栈为空的情况,在栈中,补充额外的key-value(例如'?':'?')
③若不是左括号,则弹出栈顶元素,将字符匹配该栈顶key的value值,若未匹配成功,则返回false
3:通过判断栈中是否只剩下初始的一个元素,例如:?,来判断字符串是否合法
class Solution:
    def isValid(s):

        """
        关键与上一种方法比较在于添加 '?': '?'
        否则出错:
        KeyError: '?'
        Line 13 in isValid (Solution.py)
        Line 44 in _driver (Solution.py)
        Line 55 in <module> (Solution.py)
        :return:
        """
        str_dic = {'{': '}', '[': ']', '(': ')', '?': '?'}  # 通过字典形式来初始符号的匹配

        stack = ['?']
        if len(s) % 2 is not 0:
            print("字符串长度是奇数")
            return False
        else:
            for char in s:
                if char in str_dic:
                    stack.append(char)
                elif char != str_dic[stack.pop()]:
                    return False
            # return len(stack)==1
            if len(stack) == 1:
                print("合法字符串")
                return True
            else:
                print("字符串不合法")
                return False


str = "()"
str = "()[]{}"
str = "(]"
str = "{[]}"
str == "){"
a = Solution
a.isValid(str)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值