56tps求调

P1241 括号序列

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

  1. 对于当前的字符,如果它是一个右括号,考察它与它左侧离它最近\color{red}未匹配的的左括号。如果该括号与之对应(即小括号匹配小括号,中括号匹配中括号),则将二者配对。如果左侧未匹配的左括号不存在或与之不对应,则其配对失败。

如果有一个左括号已经被匹配,你的代码还会让它再匹配一次造成错误。


|