分析:
很好的一道题目嘛~
首先说明一些东西,这里边只有()|三种字符,括号优先于|,例子中可以逐步化简:
(XXXX|(X|XX))XX,然后是(XXXX|XX)XX,最后变成XXXXXX
我们分析怎么来做这题,其实也是相当于制定规则:
从头到尾遍历,我们要选出|两端最长的个数加进来。
如果是左括号,那么找下一个看。
如果是|,我们要求他两边最大的那一个。
如果是右括号,我们返回与其前面匹配的左括号内的最大长度。
如果是x,长度加一。
是不是很好想?实现起来可能又是另一回事,代码如下所示:
#include <iostream>
#include <string>
using namespace std;
string s;
int k;
int dfs()
{
int res=0;
while(k<s.size())
{
if(s[k]=='(')
{
++k;
res+=dfs();
++k;
}
else if(s[k]=='|')
{
++k;
res=max(res,dfs());
}
else if(s[k]==')') break;
else
{
res++,k++;
}
}
return res;
}
int main()
{
// 请在此输入您的代码
cin>>s;
cout<<dfs();
return 0;
}