Leetcode 20. 有效的括号

Leetcode 20. 有效的括号

1、问题分析

题目链接:https://leetcode-cn.com/problems/valid-parentheses/
  本质上就是一个栈操作。代码我已经进行了详细的注释,理解应该没有问题,读者可以作为参考,如果看不懂(可以多看几遍),欢迎留言哦!我看到会解答一下。

2、问题解决

  笔者以C++方式解决。

#include "iostream"

using namespace std;

#include "algorithm"
#include "vector"
#include "queue"
#include "set"
#include "map"
#include "cstring"
#include "stack"

class Solution {
private:
    // 左括号栈
    stack<char> brackets;
    // 所有括号数组
    vector<char> brackets_vector = {
            '(', ')', '{', '}', '[', ']'
    };
    // 字符串是否有效标志位
    // 0 有效; 1 无效
    int flag = 0;
public:
    bool isValid(string s) {
        // 奇数长度的字符串肯定不可以
        if (s.length() % 2 == 1) {
            return false;
        }

        dealChen(s);
        // 根据标志位判断字符串是否有效
        return flag == 0;
    }


    void dealChen(string s) {
        // 遍历字符串数组
        for (int i = 0; i < s.length(); ++i) {
            // 如果是左括号,将其入栈
            if (s[i] == brackets_vector[0] ||
                s[i] == brackets_vector[2] ||
                s[i] == brackets_vector[4]) {
                brackets.push(s[i]);
            } else {
                // 如果是右括号,然鹅 栈中没有数据,说明右括号在前
                // 字符串无效
                if (brackets.size() == 0) {
                    flag = 1;
                    return;
                }
                // 否则去除栈顶元素
                char top_chen = brackets.top();
                // 判断是哪种左括号
                // 判断是否是 (
                if (s[i] == brackets_vector[1]) {
                    // 如果不等于对应的右括号 ),则字符串无效
                    if (top_chen != brackets_vector[0]) {
                        flag = 1;
                        return;
                    }
                }
                // 判断是否是 [
                else if (s[i] == brackets_vector[3]) {
                    // 如果不等于对应的右括号 ],则字符串无效
                    if (top_chen != brackets_vector[2]) {
                        flag = 1;
                        return;
                    }
                }
                // 判断是否是 {
                else if (s[i] == brackets_vector[5]) {
                    // 如果不等于对应的右括号 },则字符串无效
                    if (top_chen != brackets_vector[4]) {
                        flag = 1;
                        return;
                    }
                }

                // 如果右括号和栈中的括号匹配,则将栈中处理过的左括号弹出
                brackets.pop();
            }
        }

        // 如果处理完整个数组,栈中还有元素,说明有左括号没有出来
        // 字符串无效
        if (brackets.size() > 0) {
            flag = 1;
        }
    }
};

int main() {

    string s = "((";
//    string s = "(]";
    Solution *pSolution = new Solution;
    bool b = pSolution->isValid(s);
    cout << b << endl;
    system("pause");
    return 0;
}

运行结果

在这里插入图片描述

有点菜,有时间再优化一下。

3、总结

  难得有时间刷一波LeetCode, 这次做一个系统的记录,等以后复习的时候可以有章可循,同时也期待各位读者给出的建议。算法真的是一个照妖镜,原来感觉自己也还行吧,但是算法分分钟教你做人。前人栽树,后人乘凉。在学习算法的过程中,看了前辈的成果,受益匪浅。
感谢各位前辈的辛勤付出,让我们少走了很多的弯路!
哪怕只有一个人从我的博客受益,我也知足了。
点个赞再走呗!欢迎留言哦!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值