[牛客]构造正好K个合法括号对

题目描述

请你构造一个非空的括号字符串,包含正好 kk 个不同合法括号对。 所谓括号字符串,是指由’(‘和’)'这两种字符构成的字符串。 要求构造的字符串长度不超过100000100000。

输入描述:

一个整数K,K∈[0,10e9]

输出描述:

一个仅包含左右括号字符串,其中有 k 个合法的括号对。如果有多种构造方法,输出任意一种合法方案即可。

示例1

输入:3
输出:()()
说明:假设字符串数组下标从 1 开始,则 (1,2), (1,4), (3,4) 共计 3 个合法括号对,当然,"()))" 也是一种合法的构造

示例2

输入:4
输出:(())
说明:假设字符串数组下标从 1 开始,则 (1,3), (1,4), (2,3), (2,4) 共计 4 个合法括号对,另外,合法的构造还有"())()"、"()(()(" 等等。。

示例3

输入:9
输出:()))))))))
说明:合法的还可以是:
())())()
((()))
)()()())(
等等等。。有非常多种合法构造,输出任意即可。

代码

//代码是别人写的,我只是捋一捋他的思路
#include <bits/stdc++.h>
using namespace std;
int main(){
    int k; cin >> k;
    for(int i=1;i<=k/50000;++i){
        cout << "(";
    }
    for(int i=50000;i>=1;--i){
        if(i == k%50000){
            cout <<"(";
        }
        cout <<")";
    }
    return 0;
}

解析

一开始我想的是构造一个类似于((((((()))))))的式子,也就是对于输入k,取其平方根设为a,在a的基础上,在右半边也就是只有))))))的地方插入’(’,来表示出k个。但是事实上问题出现在a*a未必是最接近k的,例如k=31时a=5,理想状况其实是五个’(‘和6个’)’。

这个代码的思路其实是在n个’)‘组成的))))))))))前插入s个’(‘符号,并且在n个’)‘组成的))))))))))中插入’(’,并且默认n=50000。最坏情况下先是n个’(‘再是n个’)’,共计n*n对合法括号对即2500000000对,这个数值大于要求的10e9范围。

整体思路是先表示出sn对括号,再表示出k-sn对括号,k-sn是在右侧一串)))))中距离右侧末尾k-sn个’)‘的位置插入一个’(’,整个操作类似于满十进一这种,只不过这里是满50000时s加1。k<50000可以归为k>50000时的s=0的情况。

k>50000这种不是最坏情况的话可以缩减开头’(‘的个数,比如说3个’(‘和50000个’)'可以表示150000个合法括号对。

k<50000的话,第一个for就没有用了,第二个for会构造出一个长度为50000))…))))()))),它保证距离右侧末尾k个’)‘前有一个’(’,并且根据题意我们知道这个’('前面的’)'是没有实际意义的。

动态规划在解决牛客删除括号问题时,可以按照以下步骤进行: 1. 首先,我们需要理解题目的需求。题目要求我们删除括号,使得剩下的字符满足以下条件:左括号和右括号的数量相等,且左括号的位置必须在右括号的前面。 2. 接下来,我们可以使用动态规划来解决这个问题。我们可以定义一个三维的dp数组,其中dp[q][w][e]表示考虑s前q个字符,t前w个字符,且s被删除部分左括号数减去右括号数为e时,是否可行(bool类型)。 3. 然后,我们可以从前向后遍历字符s和t。在每一步中,我们可以考虑两种情况: a. 删除的左括号数目比右括号多:我们可以继续删除左括号,或者删除右括号。即dp[q][w][e] = dp[q-1][w][e+1]或dp[q-1][w][e-1]。 b. 删除的左括号数目与右括号数目相同:我们只能删除右括号。即dp[q][w][e] = dp[q-1][w-1][e-1]。 4. 最后,我们可以根据dp[len1][len2][0]的值来判断是否可行。其中len1和len2分别表示字符s和t的长度。 综上所述,通过动态规划的思路,我们可以解决牛客删除括号的问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [动态规划笔记](https://download.csdn.net/download/weixin_38617297/13751806)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [牛客_21303删括号_动态规划](https://blog.csdn.net/weixin_45619006/article/details/114650172)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值