Educational Codeforces Round 132 (Rated for Div. 2)
Problem
给出一个括号序列。现在将其中的几个字符替换为 '?'
。问:是否只有一种合法方案,使得该序列可以翻译成正确的算数表示式。
输入保证至少存在一种合法方案。
Solution
cnt:表示左括号的数量
num:表示当前未确定的问号数量
从左到右遍历,具体细节看代码
Code
int main()
{
int T; cin >> T;
while (T--)
{
string s; cin >> s;
int len = s.size();
int cnt = 0, num = 0;
s[0] = '(';
for (int i = 0; i < len; i++)
{
if (s[i] == '(') cnt++;
else if (s[i] == ')')
{
cnt--;
if (cnt < 0) cnt++, num--;//之前一个未确定的问号需要确定为 '('
}
else num++;
if (cnt == 0 && num == 1) cnt = 1, num = 0;//类似于括号序列第一个是 '?', 所以'?' 应该确定为 '('
}
cout << (cnt == num ? "YES\n" : "NO\n");
}
}