括号字符串的有效性

括号字符串的有效性

题目描述

给定一个字符串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(1lengthstr105)

输出描述:

输出一行,如果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;
}

猜你喜欢

转载自blog.csdn.net/MIC10086/article/details/108902270