思路:
首先明确题意:找符合要求的区间个数
很容易想到利用栈的括号匹配,枚举区间进行判断,此题多了问号的判断。
括号匹配不用栈的实现
首先明确题意:找符合要求的区间个数
很容易想到利用栈的括号匹配,枚举区间进行判断,此题多了问号的判断。
括号匹配不用栈的实现
bool check(string s) {
int top = 0;
for(int i = 0; i < s.size(); ++i) {
if(s[i] == '(') top++;
else top--;
if(cnt < 0) return false;
}
return cnt == 0;
}
由此改进出此题的解法
#include <iostream>
#include <string>
using namespace std;
int main() {
string s;
cin >> s;
int ans = 0;
for(int i = 0; i < s.size(); ++i) {
int low = 0, high = 0; //top's range
for(int j = i; j < s.size(); ++j) {
if(s[j] == '(') low++, high++;
else if(s[j] == ')') low--, high--;
else low--, high++;
if(high < 0) break;
if(low < 0) low = 0; //注意top小于0时需要把问号匹配
if(((j - i) & 1) && low == 0) {
ans++;
}
}
}
cout << ans << endl;
return 0;
}