leeetcode 20. 有效的括号
20. 有效的括号
问题描述
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: "()"
输出: true
示例 2:
输入: "()[]{}"
输出: true
示例 3:
输入: "(]"
输出: false
示例 4:
输入: "([)]"
输出: false
示例 5:
输入: "{[]}"
输出: true
问题分析
这个问题比较简单,只需要使用一个栈来存左括号即可,我们遍历每一个元素:
1 如果栈是空的并且遇到右括号,肯定是非法的,剩下情况只能是栈不空或者遇到左括号;
2.1 遇到左括号,则将左括号入栈;
2.2 如遇到右括号则需要比对与栈最顶上的左括号是否匹配,匹配则检查下一个元素,不匹配则非法;
3 最后遍历完每个元素如果栈仍然非空,说明左括号多了,所以非法
代码
class Solution {
public:
    bool isValid(string s) {
        int n = s.size();
        int i;
        stack<char> v;
        for(i = 0; i < n; i++)
        {
            if(v.empty() && (s[i] == ')' || s[i] == '}' || s[i] == ']'))
                return false;
            else{
                if(s[i] == '(' || s[i] == '{' || s[i] == '[')
                    v.push(s[i]);
                else{
                    if(s[i] == ')' && v.top() == '(') 
                    {
                        v.pop();
                        continue;
                    }
                    else if(s[i] == ']' && v.top() == '[') 
                    {
                        v.pop();
                        continue;
                    }
                    else if(s[i] == '}' && v.top() == '{') 
                    {
                        v.pop();
                        continue;
                    }
                    else 
                        return false;
                    }
                }
            }
        if(!v.empty())
            return false;
        else
            return true;
    }
};
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号