列表

详情


NC21579. 牛牛学括号

描述

牛牛最近在学习括号匹配问题

给你一个合法的括号序列,每次操作分两步,第一步删除第一个左括号,第二步删除某一个右括号,要保证删除之后的括号序列还是合法的,求将括号删到空为止一共有多少种不同的删除方法,两种方法不同当且仅当存在某一步右括号的删除位置不同,答案膜1e9+7

输入描述

输入一个字符串s只包含左右括号, 2 ≤ |s| ≤ 2500

输出描述

输出一个整数

示例1

输入:

()()()()()

输出:

1

示例2

输入:

(((())))

输出:

24

示例3

输入:

((()))(()(()))((()))

输出:

432

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 7ms, 内存消耗: 504K, 提交时间: 2020-07-05 18:28:29

#include<bits/stdc++.h>
using namespace std;
#define LL long long
LL m=1e9+7;
int main()
{
	string s;
	cin>>s;
	LL ans=1,num=0;
	int l=s.size();
	for(int i=0;i<l;i++)
	{
		if(s[i]=='(')num++;
		if(s[i]==')')ans=(ans*num)%m,num--;
	}
	cout<<ans<<endl;
}

C++(g++ 7.5.0) 解法, 执行用时: 4ms, 内存消耗: 512K, 提交时间: 2023-07-02 00:31:14

#include<bits/stdc++.h>
using namespace std;
int main()
{
	long long number=0,ans=1;
	string s;
	cin >> s;
	for(int i=0;i<s.size();i++){
		if(s[i]=='(') number++;
		else{
			ans=ans*number%1000000007;
			number--;
		}
	}
	cout << ans;
	return 0;	
} 

C++ 解法, 执行用时: 4ms, 内存消耗: 500K, 提交时间: 2021-08-08 20:46:24

#include<iostream>
using namespace std;
int main()
{
	long long int n=0,i,max=1;
	string s;
	cin>>s;
	for(i=0;i<s.size();i++)
	{
		if(s[i]=='(') n++;
		else
		{
			max=max*n%1000000007;
			n--;
		}
	}
	cout<<max;
	return 0;
}

Python3 解法, 执行用时: 44ms, 内存消耗: 4572K, 提交时间: 2022-11-07 17:33:23

bk=input()
left=0
sum=1
for i in bk:
    if i=='(':
        left+=1
    else:
        sum=(sum*left)%(1e9+7)
        left-=1
print(int(sum))
    

上一题