题目
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s
,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
示例 1:
输入:s = "()" 输出:true
示例 2:
输入:s = "()[]{}" 输出:true
示例 3:
输入:s = "(]" 输出:false
C++代码
#include <iostream>
#include <unordered_map>
#include <stack>
using namespace std;
/*
* 用栈解决有效括号问题
* 建立三种括号的联系,如果不是键,将元素压入栈中
* 如果是键存在联系并且栈顶是相应的值,将栈顶元素弹出
*/
bool isValid(string s) {
int n = s.size();
if (n % 2 == 1) {
return false;
}
unordered_map<char, char> pairs = { {')','('},{']','['},{'}','{'} };
stack<char> stk;
for (char c : s) {
if (pairs.count(c)) {
if (stk.empty() || stk.top() != pairs[c]) {
return false;
}
else {
stk.pop();
}
}
else {
stk.push(c);
}
}
return stk.empty();
}
int main() {
string s = "()[]{}";
bool ans = isValid(s);
cout << boolalpha << ans << endl;
return 0;
}
分析
用栈解决有效括号问题,建立三种括号的联系,如果不是键,将元素压入栈中;如果是键存在联系并且栈顶是相应的值,将栈顶元素弹出。
问题
stack(栈)的用法:https://c.biancheng.net/view/478.html
unordered_map::count() 通过给定的 key 对 unordered_map 中存在的元素数量进行计数。