《LeetCode之每日一题》:63.有效的括号

Posted 是七喜呀!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《LeetCode之每日一题》:63.有效的括号相关的知识,希望对你有一定的参考价值。

有效的括号


题目链接: 有效的括号

有关题目

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

有效字符串需满足:

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
示例 1:

输入:s = "()"
输出:true
示例 2:

输入:s = "()[]{}"
输出:true
示例 3:

输入:s = "(]"
输出:false
示例 4:

输入:s = "([)]"
输出:false
示例 5:

输入:s = "{[]}"
输出:true
提示:

1 <= s.length <= 10^4
s 仅由括号 '()[]{}' 组成

题解

法一:栈
代码一:不用哈希表

class Solution {
public:
    bool isValid(string s) {
        int n = s.length();
        if (n % 2 == 1)//减枝
            return false;
        stack<char>  st;
        for (char ch : s)
        {
            if (ch == '(' || ch == '[' || ch == '{')
                st.push(ch);
                if (ch == ')')
                {
                    if (!st.empty() && st.top() == '(')
                        st.pop();
                    else
                        return false;
                }
                if (ch == ']')
                {
                    if (!st.empty() && st.top() == '[')
                        st.pop();
                    else
                        return false;
                }
                if (ch == '}')
                {
                    if (!st.empty() && st.top() == '{')
                        st.pop();
                    else
                        return false;
                }
        }
        if (!st.empty())
            return false;
        return true;
    }
};

代码二:
使用哈希表

class Solution {
public:
    bool isValid(string s) {
        int n = s.length();
        if (n % 2 == 1)
            return false;
        unordered_map<char,int> m {
            {'(',1},
            {'[',2},
            {'{',3},
            {')',4},
            {']',5},
            {'}',6}
        };
        stack<char> st;
        for (char ch : s)
        {
            int flag = m[ch];
            if (flag >= 1 && flag <= 3)
                st.push(ch);
            else if (!st.empty() && m[st.top()] == flag - 3)
                st.pop();
            else 
                return false;
        }
        return st.empty();
    }
};

在这里插入图片描述

代码三:
使用哈希表

哈希表的键为右括号,值为相同类型的左括号
			{')', '('},//)为键 (为值
            {']', '['},
            {'}', '{'}
class Solution {
public:
    bool isValid(string s) {
        int n = s.length();
        if (n % 2 == 1)
            return false;
        
        unordered_map<char,char> pairs = {
            {')', '('},
            {']', '['},
            {'}', '{'}  
        };
        stack<char> stk;
        for (char ch : s)
        {
            if (pairs.count(ch))//找到ch对应的值
            {
                if (stk.empty() || stk.top() != pairs[ch])//pairs[ch] 为值
                    return false;
                
                //移除栈顶元素
                stk.pop();
            }
            else
                stk.push(ch);//在栈顶增加ch对应值--元素
        }
        return stk.empty();
    }
};

在这里插入图片描述

以上是关于《LeetCode之每日一题》:63.有效的括号的主要内容,如果未能解决你的问题,请参考以下文章

《LeetCode之每日一题》:190.括号生成

LeetCode每日一题

《LeetCode之每日一题》:259.括号的最大嵌套深度

LeetCode每日一题2020.7.04 32. 最长有效括号

leetcode 每日一题 20. 有效的括号

《LeetCode之每日一题》:115.字符串解码