给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: "()" 输出: true
示例 2:
输入: "()[]{}" 输出: true
示例 3:
输入: "(]" 输出: false
示例 4:
输入: "([)]" 输出: false
示例 5:
输入: "{[]}" 输出: true
核心思想: 利用栈的性质,先进后出,遇到左括号则压入栈,遇到右括号则与栈顶元素匹配,若匹配成功则将栈顶元素弹出,反之返回false。
匹配方法: 利用map建立哈希表,实现括号一一对应关系。
代码:
1 #include <iostream> 2 #include <stack> 3 #include <string> 4 #include <map> 5 using namespace std; 6 class Solution { 7 public: 8 bool isValid(string s) { 9 if(s.length()%2!=0) return false;//一但是奇数说明不是有效的括号 10 map<char,char> wordbook;//建立哈希表 11 wordbook.insert(map<char,char>::value_type('(',')')); 12 wordbook.insert(map<char,char>::value_type('[',']')); 13 wordbook.insert(map<char,char>::value_type('{','}')); 14 stack<char> mystack;//建立栈 15 for(int i=0;i<s.length();i++) 16 { 17 if(s[i]=='['||s[i]=='{'||s[i]=='(')//匹配到左括号 18 mystack.push(s[i]);//放入栈中 19 else if(s[i]==']'||s[i]=='}'||s[i]==')')//匹配到右括号 20 { 21 if(mystack.empty()) return false; 22 //匹配到右括号,栈中应该存在左括号。否则就是无效的括号 23 if(wordbook[mystack.top()]==s[i])//与栈顶元素进行匹配 24 { 25 mystack.pop();//匹配成功删除栈顶元素 26 continue; 27 } 28 else return false; 29 } 30 } 31 if(mystack.empty()) return true;//有效的括号到最后检测结束栈中应没有元素 32 else return false; 33 } 34 };