本篇博客记录的是我写过的LeetCode中关于栈的题

第一题(对应LeetCode题库的第20题)(简单题!)

(当然,后续if自己看不懂自己的总结,可以去力扣网站翻阅回对应的题目去看题解!)

题目:有效的括号(字符串的括号匹配问题)

(first遍写的时候写了一百行都没有完全能deal所有的括号字符串匹配的问题,最后我是看答案学会的!,必须要2-10刷这个题!)

        给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

        1、左括号必须用相同类型的右括号闭合。
        2、左括号必须以正确的顺序闭合。

如果链表中存在环,则返回 true 。 否则,返回 false 。

下面是示例:

本篇博客记录的是我写过的LeetCode中关于栈的题

 

 解法一:

        思路:由于我们希望,对于只包含括号的字符串中的括号字符元素中后出现的左括号优先匹配到与其对应的右括号因此,判断括号的有效性可以使用「」这一数据结构来解决。

我们遍历给定的字符串 s。当我们遇到一个左括号时,我们会期望在后续的遍历中,有一个相同类型的右括号将其闭合。由于后遇到的左括号要先闭合,因此我们可以将这个左括号直接顺序放入到栈顶中。

当我们遇到一个右括号时,我们需要将其与一个相同类型的左括号闭合。此时,我们可以取出栈顶的左括号并判断它们是否是相同类型的括号。如果不是相同的类型,或者栈中并没有左括号,那么字符串 s 无效,返回 False。为了快速判断括号的类型,我们可以使用哈希表unordered_map来存储每一种括号。哈希表的键Key为右括号,值Value为相同类型的左括号。

在遍历结束后,如果栈中没有左括号,说明我们将字符串 s 中的所有左括号闭合,返回 True,否则返回 False。

注意到有效字符串的长度一定为偶数,因此如果字符串的长度为奇数,我们可以直接返回 False,省去后续的遍历判断过程。

请看以下正确代码:

class Solution {
public:
    bool isValid(string s) {
        int n = s.size();
        if (n % 2 == 1) {
            return false;
        }//括号总数if为奇数个的话,那么必然不是一个括号匹配的字符串!

        unordered_map<char, char> pairs = {
           //{key,value},
            {')', '('},
            {']', '['},
            {'}', '{'}
        };
        stack<char> stk;
        for (char ch : s) {
            if (pairs.count(ch)) {//pairs.count(ch)这条code表明ch存在于指定好的括号内!
                //这里通过unordered_map[key] == value 的方式来寻值value!
                if (stk.empty() || stk.top() != pairs[ch]) {
                    return false;
                }
                stk.pop();
            }
            else {
                //也即忽视左括号的意思!
                //if为左括号的话,就push进栈即可!
                stk.push(ch);
            }
        }
        return stk.empty();
    }
};

我后来在看答案的基础上写的codes:

class Solution {
public:
    bool isValid(string s) {
        //首先若原来的括号字符串就是一个含有奇数个括号的字符串的话
        //那么肯定就是个非括号匹配的字符串了!
        int len = s.size();
        if (len % 2 == 1) {
            return false;
        }
        unordered_map<char, char> pairs;
        pairs.insert(make_pair(')', '('));
        pairs.insert(make_pair(']', '['));
        pairs.insert(make_pair('}', '{'));
        stack<char> stk;
        for (char ch : s) {
            if (pairs.count(ch)) {
                if (stk.empty() || stk.top() != pairs[ch]) {
                    return false;
                }
                stk.pop();
            }
            else {
                stk.push(ch);//忽视左括号!也即让左括号进栈!
            }
        }
        return stk.empty();
    }
};

可以注意到,这里我写的是:

        unordered_map<char, char> pairs;
        pairs.insert(make_pair(')', '('));
        pairs.insert(make_pair(']', '['));
        pairs.insert(make_pair('}', '{'));

而不是:

        unordered_map<char, char> pairs = {
           //{key,value},
            {')', '('},
            {']', '['},
            {'}', '{'}
        };

我认为这两种创建哈希表的方式都是可以的,当然LeetCode标准的解题答案上直接像用数组的创建方式那样去创建哈希表,这样更容易理解!我可以学习一下哈!

比如这种数组的创建方式,用在哈希表上,值得学习!:

int a[][3]= {

{0,1,2},

{2,3,4},

{5,6,7},

};)

上一篇:二叉树遍历非递归写法


下一篇:C++ 判断是不是二叉搜索树