LeetCode刷题系列20

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

有效字符串需满足:

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

注意空字符串可被认为是有效字符串。

示例 1:

输入: "()"
输出: true

示例 2:

输入: "()[]{}"
输出: true

示例 3:

输入: "(]"
输出: false

示例 4:

输入: "([)]"
输出: false

示例 5:

输入: "{[]}"
输出: true

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
  • C++编程实现:

算法:

    (1)初始化栈 S。
    (2)一次处理表达式的每个括号。
    (3)如果遇到开括号,我们只需将其推到栈上即可。这意味着我们将稍后处理它,让我们简单地转到前面的 子表达式。
    (4)如果我们遇到一个闭括号,那么我们检查栈顶的元素。如果栈顶的元素是一个 相同类型的 左括号,那么我们将它从栈中弹出并继续处理。否则,这意味着表达式无效。
    (5)如果到最后我们剩下的栈中仍然有元素,那么这意味着表达式无效。

作者:LeetCode
链接:https://leetcode-cn.com/problems/valid-parentheses/solution/you-xiao-de-gua-hao-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

方法一:

class Solution {
public:
    bool isValid(string s) {
        if (s.empty()) {
            return true;
        }
        if (s.size()%2)
            return false;
        map<char, char> sMap = {{')', '('},
                                {'}', '{'},
                                {']', '['}};
        stack<char> st;
        for (int i = 0; i < s.size(); i++) {
            if (st.empty()) {
                st.push(s[i]);
            }
            else
            {
                if (sMap[s[i]] != st.top())
                {
                    st.push(s[i]);
                }
                else
                {
                    st.pop();
                }
            }
            if (st.size() > s.size() / 2) {
                return false;
            }
        }
        return st.empty();
    }
};

方法二:

class Solution {
public:
    int get_pos(vector<char> svec, char str)
    {
        for(int i=0; i<svec.size(); i++)
        {
            if(str == svec[i])
                return i;
        }
        return 1000;
    }
    
    bool isValid(string s) {
        vector<char> s1 = {'(', '[', '{'};
        vector<char> s2 = {')', ']', '}'};
        if (count(s2.begin(), s2.end(), s[0]) != 0)
            return false;
        if (s.size() % 2 != 0)
            return false;
        stack<char> res;
        int start = 0;
        char top;
        while(start < s.size())
        {
            if (count(s1.begin(), s1.end(), s[start]) != 0)
            {
                res.push(s[start]);
                start++;
                continue;
            }
            else if (count(s2.begin(), s2.end(), s[start]) != 0)
            {
                if (res.empty())
                    return false;
                top = res.top();
                if (get_pos(s1, top) != get_pos(s2, s[start]))
                    return false;
                else
                {
                    res.pop();
                    start++;
                }
            }
        }
        if (res.empty())
            return true;
        else
            return false;
    }
};


作者:su-ge
链接:https://leetcode-cn.com/problems/valid-parentheses/solution/c-zhan-de-jian-dan-shi-xian-yi-dong-by-su-ge/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
发布了36 篇原创文章 · 获赞 23 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/yy2yy99/article/details/102958003