有效的括号
一、题目:
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。有效字符串需满足:
1、左括号必须用相同类型的右括号闭合。
2、左括号必须以正确的顺序闭合。
3、注意空字符串可被认为是有效字符串。
示例 1:
输入: “()”
输出: true
示例 2:
输入: “()[]{}”
输出: true
示例 3:
输入: “(]”
输出: false
示例 4:
输入: “([)]”
输出: false
示例 5:
输入: “{[]}”
输出: true
二、思路:
用栈来匹配字符
三、代码以及结果:
两种办法本质是一样的,都是使用栈来解决问题:
//第一种办法:
class Solution {
public:
bool isValid(string s) {
bool istrue = true;
unordered_map<char,int>m{{'(',1},{'[',2},{'{',3},{')',4},{']',5},{'}',6}};//用数字和几个字符对应起来
stack<char>st;//建栈
for(char c:s){
int flag =m[c]; //数字赋值给flag
if(flag>=1&&flag<=3) st.push(c); //如果是几种左括号之一,入栈
else if(!st.empty() &&m[st.top()] ==flag-3)st.pop(); //如果不为空,且和flag-3相匹配,栈顶出栈
else istrue =false; //其他情况设为假
}
if(!st.empty()) istrue =false; //如果栈不为空,说明有字符没出栈,说明没有一一匹配
return istrue; //返回
}
};
//第二种办法:
class Solution {
public:
bool isValid(string str){
int len = str.size();
stack<char>mystack ;
for(int i=0; i<len;++i){//遍历字符串中的各个字符,如果是括号就压入栈中
if(str[i]=='['||str[i]=='{'||str[i]=='('||str[i]=='<')
mystack.push(str[i]);
//如果是回括号
if(str[i]==']'||str[i]=='}'||str[i]==')'||str[i]=='>'){
if(mystack.empty())return false;//如果栈为空,则说明不平衡
switch(str[i])
{ case ']':
{if( '['!= mystack.top()) return false;
mystack.pop();
break;}
case ')':
{if('(' != mystack.top()) return false;
mystack.pop();
break;}
case '}':
{if( '{'!= mystack.top())return false;
mystack.pop();
break;}
case '>':
{if( '<'!= mystack.top()) return false;
mystack.pop();
break;}
}//结束switch结构}
}//结束if
}//结束for
if(mystack.empty())//栈为空表示字符串是平後
return true;
else //没有正确的匹配
{
//mystack.pop();
return false;
}
}
};
第一种办法结果:
第二种办法结果:
至此,超完美解决!