//给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。 
//
// 有效字符串需满足: 
//
// 
// 左括号必须用相同类型的右括号闭合。 
// 左括号必须以正确的顺序闭合。 
// 
//
// 
//
// 示例 1: 
//
// 
//输入:s = "()"
//输出:true
// 
//
// 示例 2: 
//
// 
//输入:s = "()[]{}"
//输出:true
// 
//
// 示例 3: 
//
// 
//输入:s = "(]"
//输出:false
// 
//
// 示例 4: 
//
// 
//输入:s = "([)]"
//输出:false
// 
//
// 示例 5: 
//
// 
//输入:s = "{[]}"
//输出:true 
//
// 
//
// 提示: 
//
// 
// 1 <= s.length <= 104 
// s 仅由括号 '()[]{}' 组成 
// 
// Related Topics 栈 字符串 
// 👍 2183 👎 0

/*
* 20 有效的括号
* 2021-02-23 21:59:02
* @author oxygenbytes
*/ 
#include "leetcode.h"

//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
public:
    bool isValid(string s) {
        stack<char> stk;
        unordered_map<char, char> mp;
        mp['('] = ')';
        mp['{'] = '}';
        mp['['] = ']';

        for(int i = 0;i < s.length();i++){
            // 根据当前元素的分类的不同,做不同的判断处理
            if(!mp.count(s[i])){  // 如果当前元素是右括号,出栈
                if(stk.empty()) return false;
                else if(mp[stk.top()] != s[i]) return false;
                else stk.pop();
            }else{ // 如果当前元素是左括号,入栈
                stk.push(s[i]);
            }
        }
        return stk.size() == 0;
    }
};
//leetcode submit region end(Prohibit modification and deletion)