#贪心 **大致思路:** 这题其实并不难,只需要**从右往左**遍历一遍一遍,遇到了右括号往左找左括号。我们定义一个标记数组,把可以匹配的括号标记出来;如果没有标记到的括号,我们直接输出一对,~~简单粗暴~~。 我们可以写出如下操作: ```cpp //a是标记数组 for(int i=0;i<str.size();++i) //从右往左遍历每一个右括号(string下标是从0开始) { if(str[i]==')') //如果是右小括号 { for(int j=i-1;j>=0;--j) //往左一个一个找它的好朋友 { if(str[j]=='('&&(!a[j])) //如果找到了它的好朋友 { a[i] = true; a[j] = true; //给它们标记一下 break; //循环拜拜 } else if(str[j]=='['&&(!a[j])) //这里有个剪枝:如果这里有一个中括号,就说明括号串起来了(例 ([)]),直接结束循环 { break; } } } if(str[i]==']') //这边也一样 { for(int j=i-1;j>=0;--j) //遍历 { if(str[j]=='['&&(!a[j])) { a[i] = true; a[j] = true; break; } else if(str[j]=='('&&(!a[j])) { break; } } } } ``` 然后我们输出一下 ```cpp for(int i=0;i<str.size();++i) //一个一个输(这里得正着) { if(!a[i]) //如果他没有好朋友 { //强行分配一个 if(str[i]=='(' || str[i]==')') { cout << "()"; } else { cout << "[]"; } } else //有了就直接输出 { cout << str[i]; } } ``` 完整代码如下(为防止 Ctrl+C ,用的是图片): ![代码样例](https://cdn.luogu.com.cn/upload/image_hosting/gb1nl3en.png) ### [AC 记录](https://www.luogu.com.cn/record/88246633)