La mayoría de las preguntas de emparejamiento de corchetes están relacionadas con la pila. Una secuencia de corchetes perfecta siempre coincide completamente con los corchetes izquierdo y derecho, por lo que si una secuencia de corchetes es una secuencia perfecta, la pila debe estar vacía después de escanear.
En esta pregunta, buscamos la secuencia perfecta más larga en una secuencia, luego colocamos el paréntesis izquierdo en la pila, y cuando encontramos el paréntesis derecho, juzgamos si puede coincidir con el paréntesis superior de la pila, si no, empujaremos la pila y actualizaremos la coincidencia máxima cada vez.
Código
#include<iostream>#include<cstdio>#include<string>#include<cstring>#include<algorithm>#include<stack>usingnamespace std;constint N =1e5+10;char str[N];intmain(){
cin >> str;int n =strlen(str);int res =0;
stack<int> stk;for(int i =0; i < n; i++){
if(stk.size()){
char c1 = str[i];char c2 = str[stk.top()];if((c1 ==')'&& c2 =='(')||(c1 =='}'&& c2 =='{')||(c1 ==']'&& c2 =='[')){
stk.pop();}else{
stk.push(i);}}else{
stk.push(i);}if(stk.size()) res =max(res, i - stk.top());else res =max(res, i +1);}
cout << res << endl;return0;}