20.有效的括号

一、题目:

20.有效的括号

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

有效字符串需满足:

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

注意空字符串可被认为是有效字符串。

示例1:

示例2:

示例3:

二、思路:

思路1:

字符串从左向右遍历,若每一个'(', '[', '{' 都有一个中间相隔了偶数个字符的 ')', ']', '}'与之对应 ,则该字符串为有效字符串。

字符串遍历采用下标,一共有三个字符'(', '[', '{' ,可采用switch结构,在case里加上对应字符判断,采用一个新的变量k计

数,判断为真则++k并退出。最后比较k是否为s.size()/2。

思路2:

采用一个栈存放字符,如果放入字符为‘)’‘】’‘}’且对应栈顶元素为‘(’‘【’‘{’则将栈顶元素退栈,否则执行进栈操作。最后若栈为空,则返回true;若不空,返回false。

三、代码(C++):

思路1:

bool isValid(string s) {
        if(s.size()%2==1)       //排除特殊情况
            return false;
        int k=0;
        for(int i=0;i<s.size();i++)           //遍历数组
        {
            switch(s[i]){                           //switch结构
                    case'(':                           
                        for(int j=i+1;j<s.size();j+=2)           //依次判断
                        {
                            if(s[j]==')')
                            {
                                ++k;
                                break;
                            }   
                        }
                        break;
                    case'[':
                        for(int j=i+1;j<s.size();j+=2)
                        {
                            if(s[j]==']')
                               {
                                ++k;
                                break;
                               }         
                        }
                        break;
                    case'{':
                        for(int j=i+1;j<s.size();j+=2)
                        {
                            if(s[j]=='}')
                               {
                                ++k;
                                break;
                               }          
                        }
                        break;               
            }
        }
        if(k==s.size()/2)                   //比较k是否为s.size()/2
            return true;
        else
            return false;
    }

思路2:

bool isValid(string s) {
        stack<char> brackets;
        for(int i=0;i!=s.size();i++)
        {
            if(brackets.empty())
            {
                brackets.push(s[i]);
                continue;
            }
            if(s[i]==')'&&brackets.top()=='(')
                brackets.pop();
            else if(s[i]==']'&&brackets.top()=='[')
                brackets.pop();
            else if(s[i]=='}'&&brackets.top()=='{')
                brackets.pop();
            else
                brackets.push(s[i]);
        }
        if(brackets.empty())
            return true;
        else
            return false;
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值