Validez de cadenas entre corchetes
Descripción del Título
Dada una cadena str, juzgue si es una cadena de corchetes válida general (la validez general: es decir, hay un esquema de coincidencia de corchetes, de modo que cada carácter de corchete puede encontrar el corchete inverso correspondiente, y la cadena no contiene no paréntesis personaje).
Ingrese una descripción:
La entrada contiene una línea, que representa str (1 ≤ lengthstr ≤ 1 0 5) str (1 \ leq length_ {str} \ leq 10 ^ 5)s t r ( 1≤l e n g t hs t r≤1 05 )。
Descripción de salida:
Imprima una línea, si str es una cadena de corchetes válida, envíe "YES", de lo contrario, envíe "NO".
Ejemplo 1
entrar
(())
Salida
YES
Ejemplo 2
entrar
()a()
Salida
NO
Descripción
()a()中包含了 ‘a’,a不是括号字符
Observaciones:
Complejidad temporal O (n) O (n)O ( n ) , complejidad espacial adicionalO (1) O (1)O ( 1 )
responder:
Escanee de adelante hacia atrás, use un contador para registrar el número de paréntesis izquierdos y regrese directamente si encuentra un carácter que no sea paréntesis; de lo contrario, el contador aumentará en uno cuando encuentre un paréntesis izquierdo. Cuando se encuentre un paréntesis derecho, si el número de paréntesis izquierdos es igual a 0, es ilegal. Simplemente regrese directamente, de lo contrario, el número de paréntesis izquierdos se reduce en uno, lo que significa que se emparejan un montón de paréntesis.
Código:
#include <cstdio>
#include <cstring>
using namespace std;
int main(void) {
char ch;
int left = 0;
while ((ch = getchar()) != '\n') {
if (ch != '(' && ch != ')') return 0 * puts("NO");
if (ch == ')' && --left < 0) {
return 0 * puts("NO");
} else if (ch == '(') ++left;
}
puts(left ? "NO" : "YES");
return 0;
}