关键字:括号匹配;栈;
题解
括号匹配,直接上栈就完事了。首先判断输入的符号是(
还是)
,如果是前者则入栈,后者先判断栈是否为空,空则ans+=1
,不空的话出栈,最后栈内剩余的是没有被匹配的,所以答案是ans
加上栈内元素数量。时间复杂度$o(n)$。
代码
AC代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| #include <algorithm> #include <cmath> #include <cstdio> #include <cstring> #include <iostream> #include <map> #include <set> #include <string> #include <stack> #include <unordered_set> #include <vector>
using namespace std;
int main() { std::ios::sync_with_stdio(false); int t; cin >> t; stack<char> st; while (t--) { int n; int ans = 0; cin >> n; char c; while (n--) { cin >> c; if (c == '(') { st.push(c); } else { if (st.empty()) { ans += 1; } else { st.pop(); } } } cout << ans + st.size() << endl; while (!st.empty()){ st.pop(); } } return 0; }
|
后记
其实不用STL的stack
也可以,只需要记录有多少个(
,应该会更快,毕竟栈内只会有着一种符号,我以为这样写会TLE,没想到居然过了,可能是训练题比较水吧。如果是多种括号的匹配,比如()[]{}
的组合,那应该只能用栈。