括号匹配的方案数
题面
牛牛最近开始学括号匹配拉
给你两个括号序列,不保证合法,求有多少种不同的方法可以将两个括号序列合并成一个合法的括号序列
合并的时候不能改变各自序列原先的顺序
输入描述:
输入两行包含两个字符串s1,s2
1 ≤ |s1|,|s2| ≤ 2500
输出描述:
输出一个整数,魔109+7
示例1
输入
(()
())
输出
19
输入
()()()()()()()()()()()()()()()()()()()()
()()()()()()()()()()()()()()()()()
输出
487340184
示例3
输入
(((((
)))))
输出
42
示例4
输入
(())())))
(())()
输出
0
备注:
子任务一30分:max(|s1|,|s2|)<=10
子任务二30分:max(|s1|,|s2|)<=100
子任务三40分:max(|s1|,|s2|)<=2500
分析
代码
#include<bits/stdc++.h>
using namespace std;
const int N=200100;
int sum1[N],sum2[N];
int f[4000][4000];
const int mod=1e9+7;
char s1[3000],s2[3000];
int main()
{
scanf("%s",s1+1);
scanf("%s",s2+1);
int len1=strlen(s1+1);
int len2=strlen(s2+1);
for(int i=1;i<=len1;i++)
sum1[i]=sum1[i-1]+(s1[i]=='('?1:-1);
for(int i=1;i<=len2;i++)
sum2[i]=sum2[i-1]+(s2[i]=='('?1:-1);
f[0][0]=1;
for(int i=0;i<=len1;i++)
for(int j=0;j<=len2;j++)
{
if(sum2[j]+sum1[i]>=0)
{
if(i>=1) f[i][j]=(((f[i][j]+f[i-1][j])%mod)+mod)%mod;
if(j>=1) f[i][j]=(((f[i][j]+f[i][j-1])%mod)+mod)%mod;
}
}
if(sum1[len1]+sum2[len2]!=0)cout<<0<<endl;
else cout<<f[len1][len2]<<endl;
}
注意特判:就是当我们将两个字符串全部拼在一起的时候,如果 '('这个字符的个数还是不等于')'这个字符,就说明我们的所有方案都不合
法,直接输出0
本文作者:邦的轩辕
本文链接:https://www.cnblogs.com/bangdexuanyuan/p/13930842.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」