题目链接:https://www.luogu.com.cn/problem/P1241
栈解法
我们可以开一个栈,然后从左到右遍历字符串中每一个元素,如果是 ‘(’ 、 ‘[’ 就讲对应的坐标入栈,如果是 ‘)’ 且此时栈顶元素为 ‘(’ 或者是 ‘]’ 且此时栈顶元素为 ‘[’ ,则标记当前元素及栈顶元素为匹配的,同时栈顶元素出栈。
最后,遍历一下每个元素,
- 如果该元素对应的坐标是被标记为匹配的,则输出该元素;
- 否则,如果该元素是 ‘(’ 或 ‘)’,输出 “()” ;如果该元素是 ‘[’ 或 ‘]’ , 输出 “[]” 。
实现代码如下:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1010;
stack<int> stk;
int n;
bool match[maxn];
char s[maxn];
int main() {
scanf("%s", s+1);
n = strlen(s+1);
for (int i = 1; i <= n; i ++) {
if (s[i] == '(' || s[i] == '[') stk.push(i);
else if (!stk.empty()) {
int j = stk.top();
if (s[j] == '(' && s[i] == ')' || s[j] == '[' && s[i] == ']') {
stk.pop();
match[j] = match[i] = true;
}
}
}
for (int i = 1; i <= n; i ++) {
if (!match[i]) {
if (s[i] == '(' || s[i] == ')') cout << "()";
else cout << "[]";
}
else cout << s[i];
}
cout << endl;
return 0;
}