20. 有效的括号

 

虽然是一道简单题,但是我还是有想法的,就想写写题解,相信你们都会做,那就来看看有没有你没考虑到的方法吧:

方法一:直接模拟

这个代码是我自己写的,写完以后才发现有这么多问题(主要是逻辑上的错误,已订正):

class Solution {

public:

    bool isValid(string s) {

        int len=s.size();

        if(len%2!=0)

        return false;

        stack <char> p;

            for(int i=0;i<len;i++)

            {

                if(p.empty()&&(s[i]==')'||s[i]==']'||s[i]=='}'))

                return false;

                else if(s[i]==')'&&p.top()=='(')

                p.pop();

                else if(s[i]==']'&&p.top()=='[')

                p.pop();

                else if(s[i]=='}'&&p.top()=='{')

                p.pop();

                else

                p.push(s[i]);

            }

        

        return p.empty();

    }

};

方法二:利用map来对应(官方题解,值得学习)

class Solution {

public: bool isValid(string s)

{ int n = s.size(); if (n % 2 == 1)

{ return false; }

unordered_map<char, char> pairs =

{ {')', '('},

{']', '['},

{'}', '{'} };

stack<char> stk;

for (char ch: s)

{ if (pairs.count(ch))//如果找到了这个字符,那么就来判断栈顶的元素是否与之对应

{ if (stk.empty() || stk.top() != pairs[ch])

{ return false; }

stk.pop(); }

else { stk.push(ch); } }

return stk.empty(); }

};

方法三:ascll码的值(大佬神解,妙手回春)

class Solution {

public:

    bool isValid(string s) {

        if(s == ""){

            return true;

        }

        vector<char> stack;

        stack.push_back(s[0]);

        for(int i=1; i<s.size(); i++){

            if(stack.empty() == true){

                stack.push_back(s[i]);

            }else if(s[i] - stack.back() == 1 || s[i] - stack.back() == 2){//注意这个地方不能加绝对值,要不然就错了

                stack.pop_back();

            } else {

                stack.push_back(s[i]);

            }

        }

        return stack.empty();

    }

};

                                                                                                             记录当下,我的编程之路

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值