关于括号的题目 leetcode20. 22. 32. 301.

leetcode20.有效的括号(简单)
https://blog.csdn.net/zhangjiaji111/article/details/120883982
leetcode22.括号生成(中等)
https://blog.csdn.net/zhangjiaji111/article/details/121915906
leetcode32.最长有效括号(困难)
https://blog.csdn.net/zhangjiaji111/article/details/120882561
leetcode301.删除无效的括号(困难)
https://blog.csdn.net/zhangjiaji111/article/details/122131839
leetcode921.使括号有效的最少添加(中等)
https://blog.csdn.net/zhangjiaji111/article/details/123920880

1.判断括号序列是否符合规范(栈也可以)

    bool judge(string s) {
        int l = 0, r = 0, n = s.size();
        if (n & 1) return false; //如果括号序列中有字母就不能用这句了
        for (auto& each : s) {
            if (each == '(') l++;
            if (each == ')') r++;
            if (r > l || l > n / 2) return false;
        }
        return l == r;
    }

括号符合规范:过程中左括号大于等于右括号最后左括号数目==右括号数目

剪枝
开始阶段:个数为奇数
过程阶段(l r累加):(1)l大于n/2 (2)r大于l
过程阶段(+1 -1):(1)剩余的个数<val,表示后面全是右括号都不匹配 (2)val小于0

2.判断括号序列是否规范(指规范的前面部分)

    bool judge(string& tmp, int n) {   //构造长度为2*n的规范序列
        int l = 0, r = 0;
        for (auto& each : tmp) {
            if (each == '(') l++;
            if (each == ')') r++;
            if (r > l || l > n) return false; 
        }
        return true;  //左括号大于右括号的话也要返回true,因为还没构造完全,不能返回false,比如((())
    }

版权声明:本文为zhangjiaji111原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。