思路:有两个问题需要解决,一个是每次遇到一个括号把括号里的运算当成一个整体处理,第二个是遇到 | 时将(前面的值与)和|中间的取最大。
那么我们将每一个()封装用dfs处理,| 左右再进行比较即可。细节见代码。
Code:
#include<iostream>
#include<map>
#define pii pair<int,int>
typedef long long ll;
using namespace std;
string str;
int p = 0;
int dfs()
{
int sum = 0, left = 0;
while (p < str.size())
{
if (str[p] == '(')
{
p++;
sum += dfs();
}
else if (str[p] == '|')
{
p++;
left = sum;
sum = 0;
}
else if (str[p] == ')')
{
p++;
break;
}
else if (str[p] == 'x')
{
p++;
sum++;
}
}
return max(left, sum);
}
int main()
{
str = "((xx|xxx)x|(x|xx))xx";
cout << dfs();
}