题目
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
输入 | 输出 | |
---|---|---|
示例1 | ( ) | true |
示例2 | ( )[ ]{ } | true |
示例3 | ( ] | false |
示例4 | ( [ ) ] | false |
示例5 | { [ ] } | true |
解决方案
首先若能全部配对,一定是偶数个,所以如果是奇数,则直接返回false;
建立一个哈希表,将三对存入map里,然后建立栈,开始遍历字符串s,
若匹配到左括号: ’ [ ’ ’ ( ’ ’ { ’ 放入栈中,
若匹配到右括号: ’ ] ’ ’ ) ’ ’ } '先判断栈是否为空,若为空,直接返回false,若不为空,判断是否与栈顶元素匹配,若匹配则删除栈顶元素,若不匹配,直接返回false;
当s遍历完毕后,若栈为空,则说明恰好完全匹配,返回true,否则返回false。
class Solution {
public:
bool isValid(string s) {
if(s.length()%2!=0) return false;
map<char,char> Map;//建立哈希表
Map.insert(map<char,char>::value_type(')','('));
Map.insert(map<char,char>::value_type(']','['));
Map.insert(map<char,char>::value_type('}','{'));
stack<char> Mapstack; //建立映射
for(int i=0;i<s.length();i++)
{
if(s[i]=='['||s[i]=='{'||s[i]=='(')
Mapstack.push(s[i]); //放入栈中
else if(s[i]==']'||s[i]=='}'||s[i]==')')
{
if(Mapstack.empty()) return false;
if(Map[s[i]]==Mapstack.top()) //与栈顶元素进行匹配
{
Mapstack.pop(); //匹配成功删除栈顶元素
}
else return false;
}
}
if(Mapstack.empty()) return true;
else return false;
}
};