自我修炼_初级算法篇_leetcode_第45题

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

有效字符串需满足:

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

示例 1:

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

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

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

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

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

提示:

1 <= s.length <= 104
s 仅由括号 '()[]{}' 组成
相关标签
栈
字符串

作者:力扣 (LeetCode)
链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/xnbcaj/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

刚开始想着用双指针,发现双指针根本不好解决这个问题。

使用栈来解决这个问题。这个就像是数学里的括号问题,你可以 ()[]{},也可以{[]()},总之必须对应。所以说我们使用哈希表来对左括号和右括号做一个定义。 

unordered_map m{{'(',1},{'[',2},{'{',3},{')',4},{']',5},{'}',6}};

这样的好处是,左括号是小于等于3的,右括号是大于3的。

接下来创建一个栈 进入循环 当小于等于3的时候,入栈,大于三的时候,判断栈顶元素-3是否等于对应的左括号的值,如果等于出栈,不等于return false。

for使用的是c++11的新定义形式。

stack st;
        bool istrue=true;
        for(char c:s){
            int flag=m[c];
            if(flag>=1&&flag<=3) st.push(c);
            else if(!st.empty()&&m[st.top()]==flag-3) st.pop();
            else {
                istrue=false;break;
                }
        }                

自我修炼_初级算法篇_leetcode_第45题_第1张图片

你可能感兴趣的:(Leetcode,leetcode,算法,职场和发展)