括号字符串的有效性
题目描述
给定一个字符串str,判断是不是整体有效的括号字符串(整体有效:即存在一种括号匹配方案,使每个括号字符均能找到对应的反向括号,且字符串中不包含非括号字符)。
输入描述:
输入包含一行,代表 s t r ( 1 ≤ l e n g t h s t r ≤ 1 0 5 ) str(1 \leq length_{str} \leq 10^5) str(1≤lengthstr≤105)。
输出描述:
输出一行,如果str是整体有效的括号字符串,请输出“YES”,否则输出“NO”。
示例1
输入
(())
输出
YES
示例2
输入
()a()
输出
NO
说明
()a()中包含了 ‘a’,a不是括号字符
备注:
时间复杂度 O ( n ) O(n) O(n),额外空间复杂度 O ( 1 ) O(1) O(1)
题解:
从前往后扫描,使用一个计数器记录左括号的数目,如果遇到非括号字符直接返回;否则的话,遇到左括号计数器加一,遇到右括号时,若左括号数目等于0,则非法,直接返回即可,否则左括号数目减一,表示一堆括号配对。
代码:
#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;
}