Pro
Sol
一个朋友问的这个题,让我帮忙debug一下,没想到被语文劝退了
这个题目麻烦就麻烦在理解题意上,在这里重新复述一下
题中所谓的“这种方式”的意思说的不是很明白,具体是:对于每一个右括号都要向左去找最近的一个没有被标记的对应的左括号,看看二者之间是否有未被标记的左括号隔开,如果没有则匹配成功,并将左右括号打上标记,最后对于没有标记的输出相应的匹配,有标记的直接输出
貌似翻译一遍就是题解了,所以说这就是一道语文题嘛
下面贴这个朋友的代码,我自己懒得写了
Code
#include <iostream>
#include <stack>
#define N 100000
using namespace std;
int main(){
stack<int>s;
char c[N]={
'\0'};
int i=0, f[N]={
0}, top[N]={
-1}, k=0;
for( cin>>c ; c[i] ; i++ ){
if(c[i] == '(' || c[i] == '['){
s.push(c[i]);
top[k++] = i;
}
else if(c[i] == ')'){
if(!s.empty() && s.top() == '('){
s.pop();
f[i] = 1;
f[top[--k]]= 1;
}
}
else if(c[i] == ']'){
if(!s.empty() && s.top() == '['){
s.pop();
f[i] = 1;
f[top[--k]]= 1;
}
}
}
for(int j = 0 ; c[j] ; j++){
if( f[j] == 1)
cout << c[j];
else if( f[j] == 0 && c[j] == '(' || f[j] == 0 && c[j] == ')')
cout << "()";
else if( f[j] == 0 && c[j] == '[' || f[j] == 0 && c[j] == ']')
cout << "[]";
}
return 0;
}