美文网首页
LeetCode——有效的括号

LeetCode——有效的括号

作者: Minority | 来源:发表于2020-01-17 10:33 被阅读0次

    题目描述

    给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
    
    有效字符串需满足:
    
    左括号必须用相同类型的右括号闭合。
    左括号必须以正确的顺序闭合。
    注意空字符串可被认为是有效字符串。
    
    示例 1:
    
    输入: "()"
    输出: true
    示例 2:
    
    输入: "()[]{}"
    输出: true
    示例 3:
    
    输入: "(]"
    输出: false
    示例 4:
    
    输入: "([)]"
    输出: false
    示例 5:
    
    输入: "{[]}"
    输出: true
    

    一、CPP 栈

    解题思路:这个问题经典的解法就是使用栈,当遇到左括号就入栈,遇到右括号就与栈顶的元素进行匹配,由于栈是后入先出,而只要遇到右括号,其左括号刚入栈,就一定在栈顶。匹配成功之后弹出栈顶元素继续上述操作,如果到最后栈为空,则说明匹配成功。出现不成功的情况有:
    1.当开始就遇到右括号==>status1解决
    2.中途左右括号不匹配==>status2解决
    3.匹配完成之后栈不为空,说明有左括号未匹配==>status3解决

    时间复杂度:O(n)。

    class Solution {
    public:
        bool isValid(string s) {
            stack<int> mystack;
            for(int i=0;i<s.size();i++)
            {   
    
                if(s[i]=='{' || s[i]=='[' || s[i]=='(')
                {
                    mystack.push(s[i]);
                }
                else
                {
                    //status1
                    if(mystack.empty())
                    {
                        return false;
                    }
    
                    char c = mystack.top();
                    mystack.pop();
                    
                    //status2
                    switch(s[i])
                    {
                        case '}': 
                            if(c == '{'){break;}
                            else{ return false;}
                        case ']': 
                            if(c == '['){break;}
                            else{ return false;}
                        case ')': 
                            if(c == '('){break;}  
                            else{ return false;}
    
                        default: return false;
                        
                    }
                }
            }
            
            //status3
            if(mystack.empty())
            {
                return true;
            }
            else
            {
                return false;
                
            }      
        }
    };
    

    二、Java stack

    class Solution {
        public boolean isValid(String s) {
            // 空字符串
            if (s.length() == 0)
                return true;
            // 排除奇数长度(位运算)
            if ((s.length() & 1) == 1)
                return false;
            Stack<Character> stack = new Stack<>();
            for (int i = 0; i < s.length(); i++) {
               //charAt()用于返回字符串指定索引处的字符。 (0 ,length() - 1)。
                switch (s.charAt(i)) {
                    case '(':
                    case '[':
                    case '{':
                        stack.push(s.charAt(i));
                        continue;
                    case ')':
                        if (stack.isEmpty() || stack.pop() != '(')
                            return false;
                        continue;
                    case ']':
                        if (stack.isEmpty() || stack.pop() != '[')
                            return false;
                        continue;
                    case '}':
                        if (stack.isEmpty() || stack.pop() != '{')
                            return false;
                        continue;
                }
            }
            return stack.isEmpty();
        }
    }
    

    三、Python

    栈只是一种先进后出的数据结构,python中虽然没有栈的现成定义,但是完全可以用数组(list)模拟栈。并且list中pop、append方法也和cpp中作用相同,甚至比其更强大。

    class Solution(object):
        def isValid(self, s):
            """
            :type s: str
            :rtype: bool
            """
            dict={")":"(","}":"{","]":"["}
            stack=[]
            for i in range(len(s)):
                if s[i] in dict :
                    if stack:
                        if stack[-1]==dict[s[i]] :
                            stack.pop()
                        else:
                            return False
                    else:
                        return False
                else:
                    stack.append(s[i])
            return not stack
    

    四、各语言及算法时间复杂度

    各语言及算法时间复杂度

    相关文章

      网友评论

          本文标题:LeetCode——有效的括号

          本文链接:https://www.haomeiwen.com/subject/pjlczctx.html