这里用回溯的话肯定炸了,我们观察会发现,实际上对于这种括号问题,每一个左边括号的所有匹配方案是由他右边的右括号决定的,有多少右括号就有多少种选择方式,我们就可以很简单的直接从右往左扫一遍,遇见了左括号就从已有的右括号里拿出一个(都可以配对),然后后续的再次配对由于顺序天然的避免了不可能的情况(也就是都可以拿到)所以说乘就可以了 由于一开始的字符串是肯定的所以说ans至少有一种情况
#include <bits/stdc++.h>
using namespace std;
#define int long long
signed main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
string s;
int MOD = 1e9 + 7;
cin>>s;
int ans = 1;
//题目说过了至少合规
int n = s.size();
int rnum = 0;
for(int r = n - 1;r >= 0;r--)
{
if(s[r] == ')')
{
rnum++;
}
else
{
ans *= rnum;
ans = ans % MOD;
rnum--;
}
}
cout<<ans<<'\n';
return 0;
}

京公网安备 11010502036488号