3_14 @ 2024-11-12 15:40:17
#include<bits/stdc++.h>
#define str to_string
using namespace std;
using ll=long long;
const int MAX=1e5+1;
string s;
bool book[MAX];
int main(){
cin>>s;
int len=s.size();
for(int i=0;i<len;i++){
if(s[i]==')'){
int j=i;
while(j--){
if(s[j]=='[')break;
if(s[j]=='('&&!book[j]){
book[i]=true;
book[j]=true;
break;
}
}
}else if(s[i]==']'){
int j=i;
while(j--){
if(s[j]=='(')break;
if(s[j]=='['&&!book[j]){
book[i]=true;
book[j]=true;
break;
}
}
}
}
for(int i=0;i<len;i++){
if(book[i])cout<<s[i];
else if(s[i]=='('||s[i]==')')cout<<"()";
else if(s[i]=='['||s[i]==']')cout<<"[]";
}
return 0;
}
by complete_binary_tree @ 2024-11-12 15:51:37
- 对于当前的字符,如果它是一个右括号,考察它与它左侧离它最近的
\color{red}未匹配 的的左括号。如果该括号与之对应(即小括号匹配小括号,中括号匹配中括号),则将二者配对。如果左侧未匹配的左括号不存在或与之不对应,则其配对失败。
如果有一个左括号已经被匹配,你的代码还会让它再匹配一次造成错误。