有效的括号

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

有效字符串需满足:

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。
 

示例 1:

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

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

输入:s = "(]"
输出:false
 

这道题目看似用栈和数学思想都能上实现,但是其实数学方法会有点问题,因为有一总情况不能符合,那就是({()}[]),用俊的方法会出现这个纰漏

想法一:用栈来实现:

复制代码
class Solution {
public:
    stack<char>st;
    bool isValid(string s) {
        if (s.size() % 2 != 0) {
            return false;
        }
        for (int i = 0; i < s.size();i++) {
            if (s[i] == '(') st.push(')');
            else if (s[i] == '{') st.push('}');
            else if (s[i] == '[') st.push(']');
            else if (st.empty() || st.top() != s[i]) return false;
            else st.pop();
        }
        return st.empty();
    }
};
复制代码

想法二:用数学匹配来实现:

复制代码
class Solution {
public:
    unordered_map<char, char> pairs = {
          {')', '('},
          {']', '['},
          {'}', '{'}
    };

    bool isValid(string nums) {
        if (nums.size() % 2 != 0) {
            return false;
        }
        int number = 0;
        for (int i = 1; i < nums.size(); i++) {
            if (pairs[nums[i]]==nums[i-1]) {
                int begin = i - 1;
                int end = i;
                while (pairs[nums[end]]==nums[begin]) {
                    number++;
                    end++;
                    begin--;
                    if (end >= nums.size() || begin < 0) {//判断溢出的操作
                        break;
                    }
                }
            }
        }
        if (number == nums.size() / 2) {
            return true;
        }
        return false;
    }
};
复制代码

 

posted @ 2022-09-09 11:35  铜锣湾陈昊男  阅读(4)  评论(0)    收藏  举报
点击右上角即可分享
微信分享提示