这道题其实没有那么复杂,就只要$O(n)$。
从头至尾遍历字符串,如果碰到匹配的左括号就加一个次数(又出现了一次),如果碰到匹配的右括号,那么它可以和前面所有的左括号匹配,所以答案加上左括号当前的出现次数。
#include <bits/stdc++.h>
using namespace std;
int main() {
string str;
cin >> str; int len = str.size();
int x = 0, ans = 0;
for (int i = 0; i < len - 1; i++) {
if (str[i] == '(') {
if (str[i + 1] == '(') x++; //是左括号,加一次匹配
}
else
if (str[i + 1] == ')') ans += x; //是右括号,可以匹配前面所有的左括号
}
printf("%d\n", ans);
return 0;
}