[hud-6799] Parentheses Matching 构造 括号匹配 2020多校3

Posted conver

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[hud-6799] Parentheses Matching 构造 括号匹配 2020多校3相关的知识,希望对你有一定的参考价值。

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6799

题目大意: 给你一个由左右括号和乘法符号组成的字符串 ()* ,可以将*变成左括号或、右括号、空字符,求能生成的最短的合法括号序列 中字典序最小的。(左括号字典序小于右括号)

合法括号序列举例: ()   ((()))   ()()(())

题解:

检测是否合法,左括号(入栈, 右括号)出栈。
用队列记录*的位置
如果碰到)括号但是栈空了,在最左边的星号*位置加左括号【如果最左边的星号位置都大于) 则无解
最后扫完还有(括号, 在最右边的星号*位置加右括号 【最右边的星号位置都小于(则无解
ac代码:
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int const maxn=1e5+7;
 4 int flag,a[maxn],len,fr,tail;
 5 char s[maxn],ans[maxn];
 6 stack<int>q;
 7 /*
 8 检测是否合法,左括号(入栈, 右括号)出栈。
 9 用队列记录*的位置
10 如果碰到)括号但是栈空了,在最左边的星号*位置加左括号【如果最左边的星号位置都大于) 则无解
11 最后扫完还有(括号, 在最右边的星号*位置加右括号 【最右边的型号位置都小于(则无解
12 */
13 void work(){
14     fr=0,tail=0;
15     while(!q.empty())q.pop();//多组数据,要清空栈
16     for(int i=0;i<len;i++){
17         if(s[i]==*){
18             a[++tail]=i;
19         }
20         else{
21             if(s[i]==(){
22                 q.push(i);
23                 ans[i]=(;
24             }
25             else{
26                 if(!q.empty()){
27                     q.pop();
28                 }
29                 else{
30                     if(fr==tail){
31                         flag=0;return ;
32                     }
33                     ans[a[++fr]]=(;
34                 }
35                 ans[i]=);
36             }
37         }
38     }
39     int g;
40     while(!q.empty()){
41         g=q.top();q.pop();
42         if(fr==tail||a[tail]<g){
43             flag=0;return ;
44         }
45         ans[a[tail--]]=);
46     }
47     flag=1;
48 }
49 void print(){
50     if(!flag){
51         printf("No solution!
");return;
52     }
53     for(int i=0;i<len;i++)if(ans[i]!= ){
54         printf("%c",ans[i]);
55     }
56     printf("
");
57 }
58 
59 int main(){
60     int t;
61     scanf("%d",&t);
62     while(t--){
63         scanf("%s",s);
64         len=strlen(s);
65         memset(a,0,sizeof(len+5));
66         for(int i=0;i<len;i++)ans[i]= ;
67         work();
68         print();
69     }
70     return 0;
71 }

 

以上是关于[hud-6799] Parentheses Matching 构造 括号匹配 2020多校3的主要内容,如果未能解决你的问题,请参考以下文章

22. Generate Parentheses

Longest Valid Parentheses

[LeetCode]Generate Parentheses

LeetCode - 22. Generate Parentheses

LeetcodeValid Parentheses

LeetcodeRemove Invalid Parentheses