1.一个左括号必然与一个有括号匹配。
2.一定是先算最里边的括号
#include<iostream> #include<cstring> #include<algorithm> using namespace std ; string s ; int pos ;//从头到尾遍历的指针 int dfs(){ int ans = 0 , tmp = 0 ; while(pos < s.size()){//只要不遍历到底就一直循环 if(s[pos] == '('){//遇到左括号就进去dfs pos ++ ; tmp += dfs() ; } else if(s[pos] == ')') {//遇到右括号就结束在这一层的循环 pos ++ ; break ; } else if(s[pos] == '|'){//遇到或就取两边的最大值 pos ++ ; ans = max(ans,tmp) ; tmp = 0 ; } else if(s[pos] == 'x') {//遇到x记录加一 pos ++ ; tmp ++ ; } ans = max(ans,tmp) ;//处理最后剩下的一波x } return ans ; } int main(){ cin >> s ; cout << dfs() << endl ; return 0 ; }